c - 数据类型不匹配和编译器冲突

标签 c printf sizeof

我正在一个名为 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 大小修饰符的令人难以置信的陈旧系统)。

在线编译器可能不会提示,因为:

  1. 它不执行深入的 printf 格式代码检查 gcc 执行 或
  2. 它是一个 32 位编译器,size_tint 的大小相同(尽管符号不同),因此没有大小不匹配,而您的本地gcc 是 64 位编译器,大小不同。
  3. 编译器根本不显示警告,以便为初学者保持输出简单。

注意gcc只是warning,不是error out,所以代码会编译完成运行。不过,警告通常表示存在问题,因此最好进一步调查。

关于c - 数据类型不匹配和编译器冲突,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35737359/

相关文章:

C printf() 不返回值

c - sizeof 运算符评估 gcc 中编译的哪个阶段

c++ - 了解 32 位 C 编译器中的 sizeof(char)

C:对 LibConfuse 内部函数的 undefined reference

strnlen可以用memchr实现吗?

c++ - 在内置类型上使用 typedef(或#defines)——有什么合理的理由吗?

检查两个数组是否已在 C 中正确连接

c - 格式说明符 Q 和 Mario 金字塔算法解决方案中的独特错误

c++ - 如何冲刺一个未签名的字符?

c - 我怎样才能知道C语言中cpu/os的位数