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视为指针(引用是在场景后面实现的)。
用编译器GCC 4.8.2和clang 4.3在GDB 7.7 Linux Arch。,Ubuntu 13.10,
上测试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上使用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。
相关文章:
- Mongodb c++驱动程序:如何查询元素的数组
- 将数组的地址分配给变量并删除
- 从C++本机插件更新Vector3数组
- lambda参数转换为constexpr技巧,然后获取带链接的数组
- 将数组作为参数传递给函数安全吗?作为第三方职能部门,可以探索他们想要的之外的其他元素
- 数组索引的值没有增加
- 将对象数组的引用传递给函数
- 为char数组调整zlib-zpipe
- 2D数组来自文本输入,中间有空格
- std::向量与传递值的动态数组
- 在c++中用vector填充一个简单的动态数组
- 使用strcpy将char数组的元素复制到另一个数组
- 结构字段名称与 GDB 中的 STL 数组冲突
- 如何在GDB中按行打印2D数组
- GDB-如何查看指针数组的内容
- sizeof引用GDB中的数组
- 使用 GDB 将数组内容打印到文件
- 传递给函数后的 GDB 打印数组仅打印第一个值,但数组仍然完好无损
- GDB不能索引到数组并打印值
- 如何在从函数传递时查看gdb中的数组内容