2014-03-07 91 views
4
int main() 
{ 
    typedef unsigned char a4[4]; 
    a4 p1; 
    a4& p2 = p1; 
    p2[1]=1; 
    cout<<sizeof(p2); 
    return p2[1]; 
} 

編譯,啓動gdb並在return上放置斷點。如果您輸入p sizeof(p2),gdb將打印8而不是4,如果您啓動程序,將會打印8。如果在gdb p sizeof(*p2)中寫入,則輸出爲4(數組的大小)。我認爲這是因爲gdb將p2視爲指針(引用是作爲指針在場景後面實現的)。gdb數組參考大小

測試了編譯器GCC 4.8.2和4.3鏘對GDB 7.7的Linux拱,Ubuntu的13.10,

這是正確的還是在gdb的錯誤嗎?

+0

有趣。聽起來像是一個「bug」給我。不過,您應該提供版本和平臺信息。 –

+0

你可以通過[gdb bugzilla](https://sourceware.org/bugzilla/)提交錯誤報告,或者如果你喜歡,我會自己做(我將包括一個鏈接到這個問題)。 –

+0

我這樣做謝謝大家的幫助我https://sourceware.org/bugzilla/show_bug.cgi?id=16675我會感謝任何意見,以便更好地描述 –

回答

4

這是您程序的修改版本。我已將陣列大小從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中得到了修復。

+0

同樣在這裏(Fedora 20,gcc-4.8.2-7 .fc20.x86_64,gdb-7.6.50.20130731-19.fc20.x86_64)。 – vonbrand

+0

在Arch Linux,gdb 7.7上確認。用g ++ 4.8.2編譯20140206(預發佈)。 – mcmlxxxvi