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

我正在研究名为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格式代码,在这种情况下, %zuz表示“width等同于size_t ”, u表示“无符号值”)。 这应该可以在所有系统上正常工作(除了极少数不能支持z尺寸修饰符的非常古老的系统)。

在线编译器可能不会抱怨,因为:

  • 它不执行深入的printf格式代码检查gcc做或
  • 它是一个32位的编译器, size_tint的大小相同(虽然签名方式不同),所以这里没有大小不匹配,而你的本地gcc是64位编译器,并且大小不同。
  • 编译器根本不显示警告,以便为初学者保持输出简单。
  • 请注意, gcc只是警告,而不是出错,所以代码将完成编译并运行。 通常警告虽然表明存在问题,所以进一步调查是一件好事。


    这是一个警告,不是错误,因此编译完成并生成可执行文件,但GCC警告您可能会导致不良行为。 至于为什么TutorialPoint不显示这个警告,类似的在线编译器网站ideone.com也不会引发这个警告。 你可以在这里看到Ideone使用GCC编译器。 在线网站通常会禁止警告以简化用户的输出。 修复警告总是一个好主意,在这种情况下,您可以使用:

    printf("Storage size for int : %zu n", sizeof(int));
    

    这可以为您节省未定义的行为问题,因为printf类型不匹配会导致读取更多内存,然后他们应该这样做。 在这里阅读更多。


    为什么我的编译器检测到数据类型不匹配

    因为printf期望%zu (而不是%d )对于sizeof(type)

    链接地址: http://www.djcxy.com/p/21139.html

    上一篇: Data Type Mismatch and Conflicting Compilers

    下一篇: Behaviour of sizeof() in C (GCC)