【问题标题】:Code giving compilation error in C99 mode [duplicate]在 C99 模式下给出编译错误的代码 [重复]
【发布时间】:2013-07-25 17:18:53
【问题描述】:

关于测试代码

#include <stdio.h>

 int main()
 {
     char a[5][3];

     printf("a = %p\n", a);
     printf("&a[0] = %p\n", &a[0][0]);
     printf("&a = %p\n", &a);
     printf("*a = %p\n", *a);

     return 0;
  }

它被编译并以 C 模式给出输出 (http://ideone.com/KD9Wz1):

a = 0xbfd8ea51
&a[0] = 0xbfd8ea51
&a = 0xbfd8ea51
*a = 0xbfd8ea51

在使用严格的C99模式(http://ideone.com/iTACGZ)编译时,会导致编译错误:

prog.c: In function ‘main’:
prog.c:7:10: error: format ‘%p’ expects argument of type ‘void *’, but argument 2 has     type ‘char (*)[3]’ [-Werror=format]
prog.c:9:10: error: format ‘%p’ expects argument of type ‘void *’, but argument 2 has    type ‘char (*)[5][3]’ [-Werror=format]
cc1: all warnings being treated as errors

上面的代码不是在C99中有效吗?

【问题讨论】:

  • 可能是,但你可以输入(void*)
  • 不,它甚至不是有效的 C89。正如编译器非常清楚地告诉您的那样,您需要将指针转换为void *
  • @KerrekSB;我已经给出了链接。看到第一个,正在编译!
  • @hacks:是-Werror,而不是-werror-Werror 只影响对警告的处理;它首先不会启用警告。此特定警告由-pedantic 以及-std=c90-std=c99-std=c11 中的任何一个启用(至少对于gcc 4.7.2)。添加演员表来解决问题。

标签: c c99


【解决方案1】:

您需要为除char* 之外的任何指针插入显式转换为void*,因为标准保证字符指针和空指针具有相同的表示:

6.2.5.27:指向void 的指针应具有与指向字符类型的指针相同的表示和对齐要求。

您的 C89 程序也有同样的问题,但编译器没有捕捉到它。

这里是修复:

printf("a = %p\n", (void*)a);
printf("&a[0] = %p\n", &a[0][0]);
printf("&a = %p\n", (void*)&a);
printf("*a = %p\n", *a);

【讨论】:

  • 不错的答案,但它不认为 int* 有错误,而 char* != int*
猜你喜欢
  • 1970-01-01
  • 2015-09-15
  • 1970-01-01
  • 2018-12-26
  • 2017-01-23
  • 1970-01-01
  • 2013-07-16
  • 2011-05-23
  • 2013-03-30
相关资源
最近更新 更多