happy coding

[lecture] C언어복습.동적메모리 본문

lecture/data structure

[lecture] C언어복습.동적메모리

yeoonii 2022. 12. 29. 16:42

연결리스트에서 사용됨

프로그램이 메모리를 할당받는 방법에는 정적(static)과 동적(dynamic)이 있다.

정적 메모리 할당이란 프로그램이 시작되기 전에 미리 정해진 크기의 메모리를 할당받는 것이다. 메모리의 크기는 프로그램이 시작하기 전에 결정된다. 단점은, 처음에 결정된 크기보다 더 큰 입력이 들어온다면 처리하지 못하고, 더 작은 입력이 들어온다면 남은 메모리 공간은 낭비된다.

동적 메모리란, 실행 도중에 동적으로 메모리를 할당받는 것을 말한다. 사용이 끝나면 시스템에 메모리를 반납해야 하며, 필요한 만큼만 할당받기에 메모리를 매우 효율적으로 사용할 수 있다. malloc()계열의 라이브러리 함수를 사용한다.

int *p;
p = (int*)malloc(sizeof(int));

void *malloc(size_t size);
/*
    malloc 은 바이트 단위로 메모리를 할당
    size는 바이트의 수
    malloc()함수는 메모리 블럭의 첫 번째 바이트에 대한 주소를 반환
    만약 요청한 메모리 공간을 할당할 수 없는 경우에는 NULL값 반환
*/
void free(void *ptr);
/*
	free는 동적으로 할당되었던 메모리 블록을 시스템에 반납
    ptr은 malloc을 이용하여 동적 할당된 메모리를 가리키는 포인터
*/
void *calloc(size_t n, size_t size);
/*
	calloc()은 malloc()과 다르게 0으로 초기화된 메모리 할당
    항목 단위로 메모리를 할당
*/
void *realloc(void *memblock, size_t size);
/*
	realloc()함수는 할당하였던 메모리 블록의 크기를 변경
*/

realloc은 쓰다가 모자라서, 값을 copy해 메모리를 추가 할당하는 방법

#include <stdio.h>
#include <stdlib.h>

int main(void){
    char *pc = NULL;
    int i = 0;

    pc = (char*)malloc(100*sizeof(char));
    if(pc == NULL){
        printf("메모리 할당 오류\n");
        exit(1);
    }
    for(i=0;i<26;i++){
        *(pc+i) = 'a' + i;
    }
    *(pc+i) = 0;

    printf("%s\n", pc);
    free(pc);

    return 0;
}
/* abcdefghijklmnopqrstuvwxyz */
#include <stdio.h>
#include <stdlib.h>

int main(void){
    int *pi;
    int i;

    pi = (int*)malloc(5*sizeof(int));

    if(pi == NULL){
        printf("메모리할당오류\n");
        exit(-1);
    }

    pi[0] = 100;
    pi[1] = 200;
    pi[2] = 300;
    pi[3] = 400;
    pi[4] = 500;

    /*printf("%s\n", &pi[0]);
    printf("%s\n", &pi[1]);
    printf("%s\n", &pi[2]);
    printf("%s\n", &pi[3]);
    printf("%s\n", &pi[4]);*/

    free(pi);
    return 0;
}
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

struct Book{
    int number;
    char title[10];
};
int main(void){
    struct Book *p;
    p = (struct Book*)malloc(2* sizeof(struct Book));
    if(p == NULL){
        printf("메모리 할당 오류\n");
        exit(1);
    }
    p->number = 1;
    strcpy(p->title,"C Program");

    (p+1)->number = 2;
    strcpy((p+1)->title,"Structure");

    free(p);
    return 0;
}

'lecture > data structure' 카테고리의 다른 글

[lecture] 연결 자료구조  (0) 2022.12.30
[lecture] C언어복습.연결리스트  (0) 2022.12.29
[lecture] C언어복습.포인터 활용  (0) 2022.12.28
[lecture] C언어복습.포인터  (0) 2022.12.28
[lecture] C언어복습.배열  (0) 2022.12.27
Comments