프로그래밍백엔드 C 개발자

C 언어에서 sizeof 연산자가 어떻게 작동하며, 사용 시 어떤 함정이 있을 수 있습니까?

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

답변

sizeof 연산자는 컴파일 시간에 타입이나 객체의 크기를 바이트 단위로 결정하는 데 사용됩니다. 주로 메모리 할당, 구조체 및 배열의 크기 계산에 필요합니다.

예시:

int a; printf("%zu ", sizeof(a)); // int 형 변수 a의 크기 printf("%zu ", sizeof(int)); // int 형의 크기

특징:

  • sizeofsize_t를 반환하며, 항상 >= 0입니다.
  • 배열의 sizeof(array)는 포인터의 크기가 아니라 전체 배열의 크기를 반환합니다.
  • 배열을 함수에 전달하면 배열의 크기 정보를 잃게 됩니다.

함정 예시:

void foo(int arr[]) { printf("%zu ", sizeof(arr)); // 배열이 아니라 포인터의 크기를 출력합니다! } int arr[10]; foo(arr); // sizeof(arr) == 40 (일반적으로), sizeof(arr의 foo 내 == 8 (일반적으로)

속임수 질문

C 언어에서 표현식 sizeof('a')는 무엇을 반환합니까?

답변: 'a'가 char처럼 보이지만, 표현식 sizeof('a')의 결과는 int 타입의 크기와 같으며, 이는 문자 상수가 C에서 int이기 때문입니다.

예시:

sizeof('a') // 일반적으로 4, 아닌 1

주제의 미세한 점을 알지 못해 발생한 실제 오류 사례


이야기

프로젝트에서 문자열 복사를 위해 메모리를 다음과 같이 할당했습니다: malloc(strlen(str) * sizeof(char)), 널 문자에 대해 잊었습니다. 이는 마지막 바이트 손실 및 표준 라이브러리 문자열 처리 함수에서 버그를 유발했습니다.

이야기

모듈 중 하나가 구조체의 전체 크기를 기대하며 sizeof(arr)를 사용했지만, 포인터의 크기만 받았습니다. 그 결과 메모리에 너무 적은 데이터를 기록하게 되어 힙이 손상되었습니다.

이야기

개발자가 한 글자의 메모리를 할당하기 위해 sizeof('a')를 사용하기로 결정했고, 1바이트를 예상했지만 4바이트(또는 8바이트)를 얻었습니다. 이는 비효율적인 메모리 소비와 예상 크기에 의존하는 코드 문제로 이어졌습니다.