c++ - sizeof 对 gdb 中数组的引用

标签 c++ reference 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,如果您启动该程序将打印 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 年 4 月 14 日获得批准并提交。我仍然在 gdb 7.7.1 中看到该错误,但它已在 7.11.1 中修复。

关于c++ - sizeof 对 gdb 中数组的引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22255860/

相关文章:

c# - 通过引用比较?

c++ - 将指向 shared_ptr 的指针传递给函数的原因是什么?

c++ - Boost Regex 子匹配在某些机器上为空

visual-studio-2008 - 在VS中,如何防止dll在引用时被复制

c - 让 GDB 列出程序中的所有函数

assembly - GDB 实模式到保护模式,即时反汇编

c++ - 为什么我的寄存器不包含我从 asm 计算的值

android - 从另一个 JNI 类获取类对象

c++ - 运行时错误 - 除以零

c++ - 那么我在哪里可以找到最好的在线 C++ 标准库引用资料?