本文介绍了C 中 sizeof() 返回值的正确格式说明符的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有以下代码:

#include<stdio.h>

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

输出:

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

但这就是问题,编译器要求我使用 %lu(long unsigned int) 而不是 %d(int),正如我所期望的那样.毕竟,我们这里只讨论个位数,不是吗?那么为什么在使用 %d 而不是 %lu 时会出现以下错误?这与我使用 64 位系统(Ubuntu 14.10)有关吗?

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 \t\t %d bytes\n", 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\t %d bytes\n", 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\t %d bytes\n", 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\t %d bytes\n", 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\n", 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\t %d bytes\n", 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\t\t %d bytes\n", sizeof(char));
     ^
Compilation finished successfully.

推荐答案

您正在尝试打印 sizeof 运算符,通常是 size_t 类型.

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

看来,在您的情况下,size_tlong unsigned inttypedef,因此它需要兼容格式说明符 要使用的 %lu.这里的返回值无所谓,你的问题是类型不匹配.

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.

注意:要获得可移植的代码,在基于 C99 和前向标准的编译器上使用 %zu 是安全的.

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

这篇关于C 中 sizeof() 返回值的正确格式说明符的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

10-22 00:32