C 언어 기초

void f(int a[10]) {
    printf("%zu\n", sizeof a);
}
int main(void) {
    int b[10] = {0};
    printf("%zu ", sizeof b);
    f(b);
    return 0;
}

int는 4바이트, 포인터는 8바이트로 한다. 위의 프로그램을 실행했을 때의 출력으로 올바른 것은?

  1. A10 10
  2. B40 8
  3. C40 40
정답과 해설 보기

정답: B. 40 8

main의 b는 요소 수 10인 int 배열이므로 sizeof b는 10 × 4 = 40바이트입니다. 함수의 인수를 int a[10]으로 써도 인수는 배열이 아니라 int에 대한 포인터(int *a)로 취급되며, f(b)에서는 배열의 첫 요소의 주소만 전달됩니다. 따라서 f 안의 sizeof a는 포인터의 크기인 8이 됩니다. gcc의 -Wall에서는 이 sizeof에 경고가 나옵니다. 함수 안에서 배열의 요소 수가 필요할 때는 요소 수를 별도의 인수로 전달합니다.

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

C 언어 기초의 다른 문제

  1. int는 4바이트로 한다. 위의 코드를 실행했을 때의 출력으로 올바른 것은?
  2. 문자열을 넣은 char 배열에 대해, 위의 코드를 실행했을 때의 출력으로 올바른 것은?
  3. 위의 선언 다음에 ㄱ "p = t;", ㄴ "*p = 'x';", ㄷ "q = t;", ㄹ "*q = 'x';" 중 하나를 쓴다. 컴파일 오류가 되는 것의 조합은?
  4. 함수 포인터 배열을 사용한 위의 프로그램을 실행했을 때의 출력으로 올바른 것은?
  5. fill과 use는 따로 정의된 함수로 한다. 위의 함수의 문제점으로 올바른 것은?