数据类型不匹配和编译器冲突
我正在研究名为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;
}
链接到课程:TutorialsPoint - C数据类型
当该程序在联机编程环境中编译并执行时,将生成以下输出:
"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
表示“width等同于size_t
”, u
表示“无符号值”)。 这应该可以在所有系统上正常工作(除了极少数不能支持z
尺寸修饰符的非常古老的系统)。
在线编译器可能不会抱怨,因为:
printf
格式代码检查gcc
做或 size_t
和int
的大小相同(虽然签名方式不同),所以这里没有大小不匹配,而你的本地gcc
是64位编译器,并且大小不同。 请注意, gcc
只是警告,而不是出错,所以代码将完成编译并运行。 通常警告虽然表明存在问题,所以进一步调查是一件好事。
这是一个警告,不是错误,因此编译完成并生成可执行文件,但GCC警告您可能会导致不良行为。 至于为什么TutorialPoint不显示这个警告,类似的在线编译器网站ideone.com也不会引发这个警告。 你可以在这里看到Ideone使用GCC编译器。 在线网站通常会禁止警告以简化用户的输出。 修复警告总是一个好主意,在这种情况下,您可以使用:
printf("Storage size for int : %zu n", sizeof(int));
这可以为您节省未定义的行为问题,因为printf
类型不匹配会导致读取更多内存,然后他们应该这样做。 在这里阅读更多。
为什么我的编译器检测到数据类型不匹配
因为printf
期望%zu
(而不是%d
)对于sizeof(type)