考虑这段代码:
static char a[2][2] = {
{ 1, 2 },
{ 3, 4 },
};
int main()
{
char **p = (char**)a; // needs cast, or compiler complains (which makes sense)
printf("%p\n", p);
printf("%p\n", &a[1][0]);
printf("%d\n", a[1][0]);
printf("%p\n", &p[1][0]); // why null? why doesn't compiler complain about this?
printf("%d\n", p[1][0]); // segfault, of course
return 0;
}
这产生了这个输出:
0x804a018
0x804a01a
3
(nil)
Segmentation fault
我知道数组可以衰减为指针。我不明白为什么编译器(g++)会让我尝试做相反的事情。如果 p 是一个 char**,为什么它让我使用 p[x][x] 而没有太多警告?它显然甚至没有接近工作,因为结果指针为空。
顺便说一句,我问的是来自第 3 方的代码,这显然对他们有用。(在 Windows 中编译,而不是使用 g++)。所以,我不是在寻找有关如何修复此代码的建议,我已经知道如何做到这一点。我只是想了解为什么编译器不抱怨,为什么结果是空指针。
谢谢。