指针指向0x1 - 检查null是否有效?

she*_*ill 1 c c++ null gdb

在我们的一些代码中; 我们得到一个分段错误,gdb stacktrace显示指针指向0x1.我们有3个这样的分段错误实例,每个都有一个; 指针最终指向0x1.

我想从这个错误中"优雅地"恢复; 而不是SEGFAULT.我无法检查NULL; 既然如此0.我是否明确检查地址0x1

这是在Linux上使用GCC3.4.2(SLES9机器)

Ana*_*tts 12

是的,你得到一个指向0x1的指针的原因很可能是因为你要取消引用一个指向null的结构:

struct some_struct* ptr = NULL;
char blah = ptr->foo;
Run Code Online (Sandbox Code Playgroud)

它发生foo在距结构开始的偏移1处.所以数学结束了*(0+1).

  • 可能是这种情况,但你仍然应该检查`ptr!= NULL`,而不是`&ptr-> foo!= 0x01`. (2认同)

pax*_*blo 10

可能不是.在源中指示NULL值,0因此检查0x1NULL是否将返回false.

恢复的方法(从技术上讲,恢复是不合理的,你真的需要防止)将假设0x1与NULL一样糟糕,并且在这种情况下不尝试使用它,例如:

if ((p == 0) || (p == 0x1))
    return;
// Otherwise use p.
Run Code Online (Sandbox Code Playgroud)

但是,我非常犹豫地称这优雅.在正确的做事情是追查是什么引起的指针被设置为无效值,并修复它.

当有人用锤子砸你的头部时,这类似于停止头痛.你可以拿一个平板电脑来缓解头痛,但肯定最好找出问题的根本原因(停止锤击).

  • 好吧,编辑过的问题是Linux而不是NT,但它无论如何都无关紧要.您仍然应该修复根本原因而不是尝试从效果中恢复. (3认同)