프로그래밍C 개발자

C에서 동적 메모리 할당 및 해제 메커니즘을 설명하고, 주요 함수(malloc, calloc, realloc, free)와 이들의 사용에 있어 일반적인 오류를 설명하십시오.

Hintsage AI 어시스턴트로 면접 통과

답변

C 언어에서 동적 메모리 관리를 위해 stdlib.h 라이브러리의 함수들이 사용됩니다:

  • malloc(size_t size) — 지정된 크기의 메모리 블록을 할당합니다. 메모리는 초기화되지 않습니다.
  • calloc(size_t nmemb, size_t size) — nmemb 요소의 배열을 위한 메모리 블록을 할당하고 0으로 초기화합니다.
  • realloc(void *ptr, size_t size) — 이전에 할당된 메모리 블록의 크기를 변경합니다.
  • free(void *ptr) — 이전에 할당된 블록을 해제합니다.

사용 예시:

int *arr = (int *)malloc(10 * sizeof(int)); if (arr == NULL) { // 메모리 할당 오류 처리 } // ... arr와 작업 ... free(arr);

항상 메모리 할당 결과를 NULL과 비교하고 free를 호출하는 것을 잊지 않아야 메모리 누수를 방지할 수 있습니다.

트릭 질문

다음 코드의 결과는 무엇일까요?

int *arr = malloc(sizeof(int) * 5); free(arr); free(arr);

답변: 동일한 메모리 영역에 대해 free를 반복적으로 호출하면 정의되지 않은 동작(undefined behavior)이 발생합니다. 동일한 포인터에 대해 메모리를 해제하는 것은 한 번만 할 수 있습니다.

주제에 대한 미세한 차이를 모르는 실제 오류 사례


이야기

시스템 테스트 자동화 프로젝트에서 정기적으로 실패가 발생했습니다. 잘못된 원인은 각 통과 후에 malloc을 통해 할당된 메모리를 해제하는 것을 잊은 시스템 루프에 있었습니다. 오랜 테스트 결과 시스템이 모든 RAM을 소모하고 멈추었습니다.


이야기

동적 배열 구현이 realloc을 사용했지만 반환 결과를 확인하지 않았습니다. 실패시(realloc이 NULL을 반환할 경우) 이전 메모리에 대한 포인터를 잃어버렸고, 메모리 누수가 발생했습니다. 이후 메모리 작업 시 세그멘테이션 오류가 발생했습니다.


이야기

전 개발자에게 구식 C 모듈 통합을 맡겼는데, 메모리를 동일한 참조로 free를 두 번 호출하는 경우였습니다. 대부분의 운영 체제에서 오류가 발생하지 않았지만 새로운 플랫폼에서 애플리케이션이 충돌하며, 그 원인은 오랜 시간 후에야 발견된 double-free 문제였습니다.