簡體   English   中英

sizeof引用gdb中的數組

[英]sizeof reference to array in gdb

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,如果啟動程序將打印。 如果用gdb p sizeof(*p2)編寫,則輸出為4(數組大小)。 我認為這是因為gdb將p2視為指針(引用在場景后面作為指針實現)。

在GDB 7.7 linux arch。,ubuntu 13.10上使用編譯器GCC 4.8.2和Clang 4.3進行測試,

這是正確的還是gdb中的錯誤?

這是您的程序的修改版本。 我已經將數組大小從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應該評估表達式,因為它們將在正在運行的程序中進行評估; 在這種情況下,它沒有這樣做。

(我在Linux Mint 14上使用gcc 4.7.2和gdb 7.5。)

更新:

OP提交了一個錯誤報告: https//sourceware.org/bugzilla/show_bug.cgi?id = 16675 ,它已被修復。 該補丁已獲批准並已提交2014-04-14。 我仍然看到gdb 7.7.1中的錯誤,但它已在7.11.1中修復。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM