C 언어 기초

struct S { char c; int i; char d; };
struct T { int i; char c; char d; };
printf("%zu %zu\n", sizeof(struct S), sizeof(struct T));

char는 1바이트, int는 4바이트이며, int를 4의 배수 주소에 맞춰 두는 일반적인 환경으로 한다. 위의 코드를 실행했을 때의 출력으로 올바른 것은?

  1. A6 6
  2. B9 6
  3. C12 8
정답과 해설 보기

정답: C. 12 8

int는 주소가 4의 배수가 되도록 놓이므로, struct S에서는 c 다음에 3바이트의 채움 바이트(패딩)가 들어가고, i는 처음부터 4바이트째, d는 8바이트째에 놓입니다. 또한 구조체를 배열로 나열해도 각 요소의 i가 맞춰지도록 전체 크기도 4의 배수로 올림되어, 9바이트 뒤에 3바이트가 더해져 12바이트가 됩니다. struct T에서는 i 뒤에 c와 d가 이어져 6바이트가 되고, 올림하여 8바이트입니다. 멤버를 큰 형부터 순서대로 나열하면 패딩을 줄일 수 있습니다.

이 분야 연습하기 분야로 돌아가기

C 언어 기초의 다른 문제

  1. uint32_t는 32비트, uint8_t는 8비트의 부호 없는 정수형이며, 리틀 엔디언 환경으로 한다. 위의 코드를 실행했을 때의 출력으로 올바른 것은?
  2. 3비트의 비트 필드에 9를 넣는 위의 코드를 실행했을 때의 출력으로 올바른 것은?
  3. #define으로 정의한 매크로 SQUARE를 사용하는 위의 코드를 실행했을 때의 출력으로 올바른 것은?
  4. 헤더 파일 sensor.h를 위와 같이 작성했다. #ifndef, #define, #endif의 세 줄의 목적으로 올바른 것은?
  5. 위의 코드를 main 함수 안에 써서 실행했을 때의 출력으로 올바른 것은?