我正在一个名为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;
}
Run Code Online (Sandbox Code Playgroud)
链接到课程:TutorialsPoint - C数据类型
在在线编程环境中编译和执行此程序时,将生成以下输出:
"Storage size for int : 4"
Run Code Online (Sandbox Code Playgroud)
当我尝试使用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));
^
Run Code Online (Sandbox Code Playgroud)
这是我的源代码,只是为了彻底:
#include <stdio.h>
#include <limits.h>
int main()
{
printf("Storage size for int : %d \n", sizeof(int));
return 0;
}
Run Code Online (Sandbox Code Playgroud)
据我所知,这个错误是%d [int数据类型]和sizeof(int)[long unsigned int]之间数据类型不匹配的结果.
为什么我的编译器检测到数据类型不匹配,而TutorialsPoint的在线编译器却没有?
sizeof产生一个size_t结果(一个无符号数量,通常在32位系统上为4个字节,在64位系统上为8个字节).printf在这种情况下,您应该使用适当的格式代码%zu(z表示"宽度等于size_t",u表示"无符号值").这应该可以在所有系统上正常工作(除了极少数不太古老的系统,不支持z尺寸修改器).
在线编译器可能不会抱怨,因为:
printf格式代码检查gcc吗或size_t和int大小相同(虽然符号性不同),所以没有一个尺寸不匹配出现,而当地gcc是一个64位编译器,以及大小不同.请注意,这gcc只是警告,而不是错误输出,因此代码将完成编译并运行.通常警告表明存在问题,因此进一步调查是一件好事.