3

次のソース ( 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])ではなく、私を表示するのですか? 予選はどうした?それとも、何か重要なものが欠けていますか? :-S(const char (*)[4])foo()paconst


更新

pa期待どおりに動作します。たとえば、

   char (*t)[4] = pa;

foo()コンパイラ内で不平を言う:

 warning: initialization from incompatible pointer type

やっているのに

   const char (*t)[4] = pa;

正常に動作します。

4

0 に答える 0