Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
842 views
in Technique[技术] by (71.8m points)

string - Correct format specifier for return value of sizeof() in C

I have the following code:

#include<stdio.h>

int main()
{
    printf("The 'int' datatype is  %lu bytes
", sizeof(int));
    printf("The 'unsigned int' data type is %lu bytes
", sizeof(unsigned int));
    printf("The 'short int' data type is %lu bytes
", sizeof(short int));
    printf("The 'long int' data type is %lu bytes
", sizeof(long int));
    printf("The 'long long int' data type is %lu bytes
", sizeof(long long int));
    printf("The 'float' data type is %lu bytes
", sizeof(float));
    printf("The 'char' data type is %lu bytes
", sizeof(char));
}

Which outputs:

The 'int' datatype is        4 bytes
The 'unsigned int' data type is  4 bytes
The 'short int' data type is     2 bytes
The 'long int' data type is  8 bytes
The 'long long int' data type is 8 bytes
The 'float' data type is     4 bytes
The 'char' data type is      1 bytes

But that's just the thing, the compiler requires that I use %lu(long unsigned int) rather than %d(int), as I would have expected. After all, we are just talking about single digit numbers here, aren't we? So why do I get the following error when using %d instead of %lu? Has it something to do with me being on a 64bit system(Ubuntu 14.10)?

helloworld.c: In function ‘main’:
helloworld.c:5:5: warning: format ‘%d’ expects argument of type ‘int’, but argument 2 has type ‘long unsigned int’ [-Wformat=]
     printf("The 'int' datatype is  %d bytes
", sizeof(int));
     ^
helloworld.c:6:5: warning: format ‘%d’ expects argument of type ‘int’, but argument 2 has type ‘long unsigned int’ [-Wformat=]
     printf("The 'unsigned int' data type is %d bytes
", sizeof(unsigned int));
     ^
helloworld.c:7:5: warning: format ‘%d’ expects argument of type ‘int’, but argument 2 has type ‘long unsigned int’ [-Wformat=]
     printf("The 'short int' data type is %d bytes
", sizeof(short int));
     ^
helloworld.c:8:5: warning: format ‘%d’ expects argument of type ‘int’, but argument 2 has type ‘long unsigned int’ [-Wformat=]
     printf("The 'long int' data type is %d bytes
", sizeof(long int));
     ^
helloworld.c:9:5: warning: format ‘%d’ expects argument of type ‘int’, but argument 2 has type ‘long unsigned int’ [-Wformat=]
     printf("The 'long long int' data type is %d bytes
", sizeof(long long int));
     ^
helloworld.c:10:5: warning: format ‘%d’ expects argument of type ‘int’, but argument 2 has type ‘long unsigned int’ [-Wformat=]
     printf("The 'float' data type is %d bytes
", sizeof(float));
     ^
helloworld.c:11:5: warning: format ‘%d’ expects argument of type ‘int’, but argument 2 has type ‘long unsigned int’ [-Wformat=]
     printf("The 'char' data type is %d bytes
", sizeof(char));
     ^
Compilation finished successfully.
See Question&Answers more detail:os

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Reply

0 votes
by (71.8m points)

You're trying to print the return value of sizeof operator, which is usually of type size_t.

It appears, in your case, size_t is a typedef of long unsigned int, so it demands it's compatible format specifier %lu to be used. The returned value here does not matter, your problem is with the type mismatch.

Note: To have a portable code, it's safe to use %zu, on compilers based on C99 and forward standards.


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
OGeek|极客中国-欢迎来到极客的世界,一个免费开放的程序员编程交流平台!开放,进步,分享!让技术改变生活,让极客改变未来! Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...