C99模式下给出编译错误的代码

C99模式下给出编译错误的代码,c,c99,C,C99,关于代码测试 #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; } 使用严格的C99模式()编译时,会导

关于代码测试

#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;
  }
使用严格的C99模式()编译时,会导致编译错误:

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中不是有效的吗?

您需要为除
char*
之外的任何指针插入显式转换到
void*
,因为标准保证字符指针和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);

可能是,但您可以将case键入
(void*)
不,它甚至不是有效的C89。正如编译器非常明确地告诉您的,您需要将指针转换为
void*
@KerrekSB;我已经给出了链接。看第一个,它正在编译@haccks:它是
-Werror
,而不是
-Werror
<代码>-Werror仅影响警告的处理;它首先不启用警告。此特定警告由
-pedantic
以及
-std=c90
-std=c99
-std=c11
中的任何一个启用(至少对于gcc 4.7.2)。添加强制转换以解决问题。答案不错,但它认为
int*
没有错误,而
char*
!=<代码>整数*
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);