[C] sizeof warning 에러

hyuckhoon.ko·2022년 2월 18일
0

sizeof 연산자는 어떤 자료형을 리턴하는지에 대한 이야기다.
C언어 책의 자료형을 배우다 보면 아래와 같은 단골 예제가 나온다.


#include <stdio.h>

int main(void)
{
    char sch = '1';
    printf("%d\n", sizeof(sch));

    return 0;
}

그리고 아래와 같은 경고 메시지를 만나게 된다.

main.c:8:20: warning: format specifies type 'int' but the argument has type 'unsigned long' [-Wformat]
printf("%d\n", sizeof(sch));
~~ ^~~
%lu
1 warning generated.
1



분명 학교에서 C언어를 배울 당시에는 위와 같은 경고 메시지를 보진 못했던 것 같은데......
컴파일러에 따라 결과가 달라질 수 있고, 운영체제가 64bit 를 지원하느냐, 기존의 32bit를 지원하느냐에 따라 (즉, 사용자의 machine에 따라) 컴파일러가 다른 결과를 리턴한다고 한다.

스택오버플로우에서는
%d 포맷을 사용해도 괜찮다. 그러니 경고는 무시해도 된다 라는 의견도 있다.

sizeof operator in C에서는
"The result of sizeof is of unsigned integral type which is usually denoted by size_t."

이해가 갔다.

변수나 상수 또는 자료형의 크기를 리턴하는 연산자가 음수를 리턴할 필요가 있을까

맥 기반 VCC에서의 컴파일러는
sizeof 연산자의 리턴값은 unsigned long으로, 정수형 8바이트의 크기를 갖는 값을 저장할 수 있다고 말하고 있다.

specifies type 'int' but the argument has type 'unsigned long' [-Wformat]

#include <stdio.h>
int main()
{
	// %lu 포맷 사용
    printf("%lu\n", sizeof(char));
    printf("%lu\n", sizeof(int));
    printf("%lu\n", sizeof(float));
    printf("%lu\n", sizeof(double));
    return 0;
}

참고자료
https://stackoverflow.com/questions/3209909/how-to-printf-unsigned-long-in-c

1개의 댓글

comment-user-thumbnail
2022년 9월 25일

감사합니다. lu형으로 하니까 경고없이 출력되는데 %d 로 하니 경고가 뜨고 출력이 되네요.

답글 달기