我正在一个名为 TutorialsPoint 的网站上学习 C 编程语言的基本概念。该网站上的源代码示例可以包括一个“试用”按钮,该按钮打开一个带有在线 c 编译器(GNU GCC 版本 4.7.2)的在线 c 编程环境。在一个示例中演示了 sizeof() 函数。这是源代码。
#include <stdio.h>
#include <limits.h>
int main() {
printf("Storage size for int : %d \n", sizeof(int));
return 0;
}
类(class)链接:TutorialsPoint - C Data Types
当在在线编程环境中编译和执行该程序时,产生如下输出:
"Storage size for int : 4"
当我尝试使用 GNU GCC 5.2.1 版在我的计算机上编译相同的代码时,我收到以下错误消息:
gcc sizeofExample.c
sizeofExample.c: In function 'main':
sizeofExample.c:6:10: warning: format '%d' expects argument of type 'int',
but argument 2 has type 'long unsigned int' [-Wformat=]
printf("Storage size for int: %d \n", sizeof(int));
^
这是我的源代码,只是为了完整:
#include <stdio.h>
#include <limits.h>
int main()
{
printf("Storage size for int : %d \n", sizeof(int));
return 0;
}
我知道这个错误是 %d [int 数据类型] 和 sizeof(int) [long unsigned int] 之间数据类型不匹配的结果。
为什么我的编译器检测到数据类型不匹配,而 TutorialsPoint 的在线编译器却检测不到?
最佳答案
sizeof
产生一个 size_t
结果(一个无符号数,在 32 位系统上通常为 4 字节,在 64 位系统上为 8 字节)。您应该使用适当的 printf
格式代码,在本例中为 %zu
(z
表示“宽度等于 size_t
",u
意思是“无符号值”)。这应该在所有系统上都能正常工作(除了极少数不支持 z
大小修饰符的令人难以置信的陈旧系统)。
在线编译器可能不会提示,因为:
- 它不执行深入的
printf
格式代码检查gcc
执行 或 - 它是一个 32 位编译器,
size_t
和int
的大小相同(尽管符号不同),因此没有大小不匹配,而您的本地gcc
是 64 位编译器,大小不同。 - 编译器根本不显示警告,以便为初学者保持输出简单。
注意gcc
只是warning,不是error out,所以代码会编译完成运行。不过,警告通常表示存在问题,因此最好进一步调查。
关于c - 数据类型不匹配和编译器冲突,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35737359/