C언어 메모리 동적할당 동적할당

    2018-02-10 15:10:02 작성

    메모리 동적할당은 변수의 생성과 소멸 시점을 프로그래머가 결정할 수 있습니다.
    메모리 동적할당은 다음의 순서로 이루어집니다.
    메모리 동적할당을 하려면 stdlib.h를 포함해야 합니다.

    1. 동적으로 할당받을 기억공간 주소를 가리킬 포인터변수를 선언합니다
    2. malloc() 함수를 이용해서 기억공간을 동적 할당받습니다
    3. 사용이 다 끝나면 free() 함수를 이용해서 기억공간을 해제합니다.

    malloc

    힙 영역에 기억공간을 할당합니다.

    void* malloc(size_t size)

    malloc 함수 호출 성공시 할당된 메모리 주소를 반환하고 실패시 NULL 포인터를 반환합니다.
    size 크기만큼의 공간을 할당합니다.
    void* 자료형으로 반환하므로 사용하려는 자료형으로 변환하여 사용합니다.


    free

    동적할당받은 기억공간을 해제합니다.

    void free(void* ptr)

    동적 할당 받은 변수는 사용이 끝난 후에는 반드시 해제해야 합니다.

    #include <stdio.h>
    #include <stdlib.h>
    
    char* getStr();
    
    int main(void) {
    	char * str1;
    	char * str2;
    	str1 = getStr();
    	str2 = getStr();
        printf("%s\n", str1);
    	printf("%s\n", str2);
        free(str1); // 사용이 다 끝난 변수는 해제
    	free(str2);
    	return 0;
    }
    
    char* getStr() {
    	char* str = (char*)malloc(sizeof(char) * 30); // 30byte 공간을 할당받음
    	printf("문자열 입력 : ");
    	scanf("%s", str);
    	return str; // 힙영역에 있으므로 함수가 종료되도 참조가능
    }


    getStr 함수의 str 변수가 'char str[30]' 처럼 지역변수로 선언되었다면 함수 종료시 스택 영역에서 소멸 되지만, malloc함수로 힙 영역에 동적 할당 하여 주소를 반환하기 때문에 getStr함수가 종료되어도 main 함수에서 힙영역의 포인터 주소를 가지고 접근할 수 있습니다.
    동적 할당 받은 변수는 사용이 끝난 후에는 반드시 해제해야 합니다.


    calloc

    calloc 함수는 malloc과 똑같이 작동하는 함수이며 매개변수의 차이만 있습니다.

    void * calloc(size_t num, size_t size);

    calloc 은 size크기의 공간은 num 개만큼 할당받습니다.
    다음은 double 자료형 10개를 할당받는 malloc 함수와 calloc 함수의 비교입니다.

    double* ptr = malloc(sizeof(double)*10);
    double* ptr = malloc(10, sizeof(double))

    realloc

    malloc함수에 의해 할당된 메모리의 크기를 조절합니다.

    void * realloc(void *ptr, size_t size);

    realloc 함수 호출 성공시 새로 할당된 메모리주소를 반환하고, 실패시 NULL 포인터를 반환합니다.
    성공시 반환하는 포인터주소값은 이전에 사용하던 주소값과 같을수도 있고 다를수도 있습니다

    int* ptr = (int*)malloc(sizeof(int)*3); // int자료형 3개
        ...
    ptr = (int*)realloc(ptr, sizeof(int)*10) // int자료형 10개로 크기 조정

    연습문제

    1. 사용자로 부터 정수를 0이 입력되기 전까지 정수를 입력받습니다.
    2. 0이 입력되면 입력받은 순서대로 출력하고, 그 합을 구하여 출력합니다.
    사용자로 부터 입력받을 개수는 알 수 없으므로 최초 동적 할당은 3개를 받고 가득 찰때마다 공간을 3개씩 늘려보세요.