【问题标题】:why is 0x0 pointing to valid data为什么 0x0 指向有效数据
【发布时间】:2014-01-31 01:35:36
【问题描述】:

在使用 GDB 调试崩溃时,我发现程序在 ASSERT() 中崩溃。奇怪的是,指针包含指向有效数据的 0x0。

示例代码:

#define MAX_NUM 10;
...
...
assert(x->y != NULL);
assert(x->y->z < MAX_NUM);  <-- Crashes here

我可以看到“x”指向一个有效地址。当我这样做时:

(gdb) print x
$16 = 0x841eda3
(gdb) print x->y
$17 = 0x0
(gdb) print *x->y
$18 = {
       ...
       ...
       z = 1;
       ...
}

这怎么可能?我不应该从 GDB 收到“无法访问地址 0x0 的内存”错误吗?

【问题讨论】:

  • 是数据,你确定是有效数据吗?
  • 是的,'y' 的所有字段看起来都很正常。
  • @aditya:当你 print *(x-&gt;y) 时会发生什么 - 它给你的结果是否与 print *x-&gt;yprint (*x)-&gt;y 不同?
  • @Brendan print *(x-&gt;y) 给出与print *x-&gt;y 相同的结果。 print (*x)-&gt;y 打印 0x0

标签: c


【解决方案1】:

什么版本的 GDB?

核心转储并不总是说实话。他们可以在很多方面搞砸。我有看起来有效但不是的核心转储。我认为您只是很幸运,它看起来不错。

【讨论】:

    猜你喜欢
    • 2017-04-22
    • 2018-04-03
    • 1970-01-01
    • 2020-07-31
    • 1970-01-01
    • 2015-10-24
    • 1970-01-01
    • 1970-01-01
    • 2012-07-03
    相关资源
    最近更新 更多