2014-03-07 59 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