【发布时间】: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)。添加演员表来解决问题。