我正在一个名为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 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的在线编译器却没有?
答案 0 :(得分:5)
sizeof
产生size_t
结果(无符号数量,通常在32位系统上为4个字节,在64位系统上为8个字节)。您应该使用适当的printf
格式代码,在这种情况下%zu
(z
表示“宽度相当于size_t
”,u
表示“无符号值”) 。这应该适用于所有系统(除了极少数不太古老的系统,不支持z
尺寸修改器)。
在线编译器可能不会抱怨,因为:
printf
格式代码检查gcc
或size_t
和int
大小相同(虽然签名不同),因此没有大小不匹配,而您的本地gcc
是64位编译器,大小不同。请注意gcc
只是警告,而不是错误输出,因此代码将完成编译并运行。通常警告表明存在问题,因此进一步调查是一件好事。
答案 1 :(得分:2)
这是一个警告而不是错误,因此编译正在完成并生成可执行文件,但GCC警告您可能会导致不良行为。至于TutorialPoint没有显示此警告的原因,类似的在线编译器网站ideone.com also doesn't throw this warning.您可以看到Ideone使用GCC编译器的here。在线网站通常会禁止警告以简化用户的输出。修复警告总是一个好主意,在这种情况下,您可以使用:
printf("Storage size for int : %zu \n", sizeof(int));
这可能会从不匹配的printf
类型中为您节省未定义行为问题,从而获得更多内存。详细了解此here。
答案 2 :(得分:1)
为什么我的编译器检测到数据类型不匹配
因为printf
%zu
需要%d
(而不是sizeof(type)
){{1}}