안녕하세요 C에서 포인터는 무엇을 가리키던 항상 4바이트로 나와야 한다고 알고 있는데..
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct Point2D
{
int x;
int y;
};
int main()
{
printf("%d %d %d", sizeof(char*), sizeof(int*), sizeof(struct Point2D*));
return 0;
}
이 코드를 컴파일하면
warning: format ‘%d’ expects argument of type ‘int’, but
argument 4 has type ‘long unsigned int’ [-Wformat=]
라고 하네요.왜 pointer to struct 는 long unsigned int 크기를 가지나요?
UNIT 34.8 퀴즈부터 학습한 것으로 나옵니다.
본문 학습 기록이 없습니다.
<C 언어 코딩 도장>은 순차적인 학습을 전제로 설계되어 있습니다.
순차적으로 학습해서 기초를 제대로 학습하세요.
포럼에 질문을 올리는 유형을 보면 처음부터 기초를 제대로 학습하는 사람이면 할 수 없는 질문 유형이 올라오는 경우가 있습니다. 이 경우 학습 기록을 보면 순차적인 학습을 하지 않은 유형의 학습자, 기존에 어디선가 공부한 경험이 있는 사람이 시작하는 경우가 많습니다.
해당 질문은 UNIT 34.1의
64비트로 컴파일하는 방법은 '부록 13. 64비트 사용하기'을 참조하세요.
1강부터 학습했는데 기록이 없네요.(왜 그런지는 모르겠네요.. 모르고 새로운 계정으로 가입해서 들어온 것 같습니다) 순차적으로 학습했고 말씀하신 포인터 부분도 공부한 다음 순서대로 넘어왔습니다.
또 참고하라고 하신 부록13번도 읽어보았는데 제가 질문한 내용과 관련은 없어보입니다.
질문의 요점이 명확하지 않았다면 다시 한번 질문드립니다. sizeof(struct Point2D*)는 구조체를 가리키는 포인터의 크기를 구하는 것인데 왜 자료형이 long unsigned int이라고 나오는지가 궁금합니다.
질문에 답해 주셔서 감사합니다.
온라인 컴파일러에 좀 더 정확하게 오류를 표기하게 옵션을 지정했습니다.
https://glot.io/snippets/flvejzb7cf
왼쪽 상단 C 아이콘을 클릭하면 컴파일러 옵션을 확인할 수 있습니다. clang, gcc 모두 공통입니다.
clang main.c -Wall -ansi -pedantic -std=c11 && ./a.out
gcc main.c -Wall -ansi -pedantic -std=c11 && ./a.out
8 8 8
main.c:11:24: warning: format specifies type 'int' but the argument has type 'unsigned long' [-Wformat] printf("%d %d %d", sizeof(char*), sizeof(int*), sizeof(struct Point2D*)); ~~ ^~~~~~~~~~~~~ %lu main.c:11:39: warning: format specifies type 'int' but the argument has type 'unsigned long' [-Wformat] printf("%d %d %d", sizeof(char*), sizeof(int*), sizeof(struct Point2D*)); ~~ ^~~~~~~~~~~~ %lu main.c:11:53: warning: format specifies type 'int' but the argument has type 'unsigned long' [-Wformat] printf("%d %d %d", sizeof(char*), sizeof(int*), sizeof(struct Point2D*)); ~~ ^~~~~~~~~~~~~~~~~~~~~~~ %lu 3 warnings generated.
%lu를 써야 합니다.
%d로도 결과가 출력되는 건 sizeof의 결과를 암묵적으로 int 형으로 변환하기 때문입니다.
사용하는 컴파일러에서 옵션을 지정하고 시도해보세요.
오류가 없게 하려면 포인터의 크기를 출력할 때 32비트 플랫폼에서는 %u를 써야 하고, 64비트 플랫폼에서는 %lu를 써야 합니다.
포인터의 크기가 고정되어 있고, 값이 4 또는 8인 경우가 대부분이라서 %d int 타입으로 변환해도 오류가 발생하는 경우는 없습니다.