在测试代码
#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;
}
Run Code Online (Sandbox Code Playgroud)
它被编译并以C模式给出输出(http://ideone.com/KD9Wz1):
a = 0xbfd8ea51
&a[0] = 0xbfd8ea51
&a = 0xbfd8ea51
*a = 0xbfd8ea51
Run Code Online (Sandbox Code Playgroud)
在使用严格的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
Run Code Online (Sandbox Code Playgroud)
上面的代码是不是在C99中有效?
您需要void*为任何指针插入显式强制转换,除非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);
Run Code Online (Sandbox Code Playgroud)