메모리 동적할당은 변수의 생성과 소멸 시점을 프로그래머가 결정할 수 있습니다.
메모리 동적할당은 다음의 순서로 이루어집니다.
메모리 동적할당을 하려면 stdlib.h를 포함해야 합니다.
힙 영역에 기억공간을 할당합니다.
void* malloc(size_t size)
malloc 함수 호출 성공시 할당된 메모리 주소를 반환하고 실패시 NULL 포인터를 반환합니다.
size 크기만큼의 공간을 할당합니다.
void* 자료형으로 반환하므로 사용하려는 자료형으로 변환하여 사용합니다.
동적할당받은 기억공간을 해제합니다.
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 함수는 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))
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개씩 늘려보세요.