這是您程序的修改版本。我已將陣列大小從4更改爲17,以確保其大小與其他任何區別。我還更改了類型和變量名稱,以使代碼更容易遵循,並添加了#include <iostream>
以便實際編譯。我也刪除了一些不必要的東西。
#include <iostream>
int main()
{
typedef unsigned char char17[17];
char17 arr17;
char17& arr17_ref = arr17;
std::cout << "sizeof(arr17) = "
<< sizeof arr17
<< ", sizeof(arr17_ref) = "
<< sizeof(arr17_ref)
<< "\n";
return 0;
}
當我在我的系統上編譯並運行它時,輸出是17
。
當我gdb
下運行它,我得到8(指針我的系統上的大小):
$ gdb ./c
GNU gdb (GDB) 7.5-ubuntu
[snip]
Reading symbols from /home/kst/c...done.
(gdb) b 12
Breakpoint 1 at 0x40097e: file c.cpp, line 12.
(gdb) r
Starting program: /home/kst/c
sizeof(arr17) = 17, sizeof(arr17_ref) = 17
Breakpoint 1, main() at c.cpp:12
12 return 0;
(gdb) p sizeof(arr17)
$1 = 17
(gdb) p sizeof(arr17_ref)
$2 = 8
(gdb) c
Continuing.
[Inferior 1 (process 23420) exited normally]
(gdb) q
$
是的,這是在gdb的錯誤。 gdb應該評估表達式,因爲它們將在正在運行的程序中進行評估;在這種情況下,它沒有這樣做。
(我用gcc 4.7.2和Linux Mint的14 7.5 gdb的)
UPDATE:
的OP提交Bug報告:https://sourceware.org/bugzilla/show_bug.cgi?id=16675 和它得到修復。該補丁已獲批准並提交2014-04-14。我仍然可以看到gdb 7.7.1中的錯誤,但它在7.11.1中得到了修復。
有趣。聽起來像是一個「bug」給我。不過,您應該提供版本和平臺信息。 –
你可以通過[gdb bugzilla](https://sourceware.org/bugzilla/)提交錯誤報告,或者如果你喜歡,我會自己做(我將包括一個鏈接到這個問題)。 –
我這樣做謝謝大家的幫助我https://sourceware.org/bugzilla/show_bug.cgi?id=16675我會感謝任何意見,以便更好地描述 –