C 언어에서 실행 중에 필요한 배열 크기가 정해지거나 함수 밖까지 살아 있어야 하는 메모리가 필요하면 malloc()을 사용한다.
형태는 void *malloc(size_t size) 이다.
size 바이트의 연속된 메모리를 확보하고 시작 주소를 반환한다.
실패하면 NULL을 반환하며 확보된 메모리의 내용은 초기화되지 않는다.
C에서는 void 포인터가 자동 변환되므로 malloc 반환값에 불필요한 형변환을 붙이지 않는 편이 좋다.
크기 단위는 원소 수가 아니라 바이트다. 예제의 100 * sizeof(*numbers)는 int 100개가 들어갈 공간을 뜻하며 값이 자동으로 0이 되지는 않는다.
size_t count = 100;
int *numbers = malloc(count * sizeof(*numbers));
if (numbers == NULL) {
perror("malloc");
return 1;
}
numbers[0] = 10;
free(numbers);
sizeof(int)보다 sizeof(*numbers)처럼 쓰면 변수 타입을 바꿔도 계산식이 따라간다.
count와 원소 크기의 곱이 size_t 범위를 넘지 않는지도 큰 입력에서는 확인해야 한다.
0바이트 malloc의 반환은 구현에 따라 NULL일 수도 있고 해제 가능한 고유 포인터일 수도 있으므로 의존하지 않는 것이 낫다.
답글 달기