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

时间:2016-03-02 02:31:38

标签: 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;
}

课程链接: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的在线编译器却没有?

3 个答案:

答案 0 :(得分:5)

sizeof产生size_t结果(无符号数量,通常在32位系统上为4个字节,在64位系统上为8个字节)。您应该使用适当的printf格式代码,在这种情况下%zuz表示“宽度相当于size_t”,u表示“无符号值”) 。这应该适用于所有系统(除了极少数不太古老的系统,不支持z尺寸修改器)。

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

  1. 它没有执行深度printf格式代码检查gcc
  2. 这是一个32位编译器,size_tint大小相同(虽然签名不同),因此没有大小不匹配,而您的本地gcc是64位编译器,大小不同。
  3. 编译器不会显示警告,以保持初学者的输出简单。
  4. 请注意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}}