给出以下来源(main.c
):
void foo(const char (*pa)[4])
{
}
int main(void)
{
const char a[4] = "bar";
foo(&a);
}
... 使用 GCC (gcc (Debian 4.9.2-10) 4.9.2) 编译并在 GDB (GNU gdb (Debian 7.7.1+dfsg-5) 7.7.1) 下运行 ...
(gdb) b main
Breakpoint 1 at 0x4004c8: file main.c, line 7.
(gdb) b foo
Breakpoint 2 at 0x4004be: file main.c, line 3.
(gdb) r
Breakpoint 1, main () at main.c:7
7 const char a[4] = "bar";
(gdb) p &a
$1 = (const char (*)[4]) 0x7fffffffe1a0
(gdb) c
Continuing.
Breakpoint 2, foo (pa=0x7fffffffe1a0) at main.c:3
3 }
(gdb) p pa
$2 = (char (*)[4]) 0x7fffffffe1a0
...为什么 GDB 显示我(char (*)[4])
而不是(const char (*)[4])
作为foo()
参数的类型pa
?const
预选赛怎么了?还是我错过了一些重要的东西?:-S
更新:
pa
表现如预期。如果例如做
char (*t)[4] = pa;
编译器内部foo()
抱怨:
warning: initialization from incompatible pointer type
而在做
const char (*t)[4] = pa;
工作正常。