함수 | 주요 기능 | 초기화 여부 | 크기 인자 방식 | 사용 예시 |
malloc | 지정한 바이트만큼 메모리 할당 | 초기화 X(쓰레기 값) | malloc(size_in_bytes) | malloc(10 * sizeof(int))
|
calloc | 배열 요소 개수 * 요소 크기만큼 메모리 할당 | 0으로 초기화 | calloc(num_elements, element_size) | calloc(10, sizeof(int)) |
realloc | 기존에 malloc/calloc/realloc으로 확보한 블록 크기 변경 | 내용 보존 (추가된 부분은 초기화 X) | realloc(ptr, new_size_in_bytes) | realloc(arr, 20 * sizeof(int)) |
malloc
void *malloc(size_t size);
•
지정한 바이트 수만큼 메모리 할당받음
•
초기화 X → 기존 메모리에 있던 쓰레기값이 들어감
int *arr = malloc(10 * sizeof(int)); // int 10개 공간
C
복사
calloc
void *calloc(size_t num_elements, size_t element_size);
•
배열 요소 개수 × 각 요소 크기만큼 메모리를 할당하고 모두 0으로 초기화
•
자동으로 0으로 초기화
int *arr = calloc(10, sizeof(int)); // int 10개 공간, 전부 0
C
복사
realloc
void *realloc(void *ptr, size_t new_size);
기존에 malloc, calloc, realloc으로 확보한 메모리 크기를 변경하고자 할 때 사용
•
새로운 크기로 확장/축소
•
기존 데이터는 유지 (새로 추가된 부분은 초기화 X)
•
내부적으로 새 블록을 할당하고 복사하는 경우도 존재
필요할 경우 전혀 다른 위치에 새로운 메모리를 잡고, 기존 데이터를 거기로 복사한 뒤, 옛 주소를 버릴 수 있음
◦
그래서 임시 변수에 realloc으로 반환받은 값을 즉시 원본에 덮어쓰기보다는, 임시 변수에 받은 후에 임시 변수의 값이 NULL이 아니라면 원본에 덮어쓰는 형태로 쓰는 게 좋음(즉시 원본에 덮어쓰면, realloc으로 반환받은 값이 메모리 공간이 부족해 NULL이더라도 원본에 사용하게 됨으로써 원본 데이터는 날아감)
int *arr = malloc(5 * sizeof(int));
arr = realloc(arr, 10 * sizeof(int)); // 크기 확장
C
복사
