小编Jit*_*dra的帖子

通过空结构指针取消引用变量地址,没有分段错误

typedef struct {
    int a;
}stTemp_t;

int main()
{
stTemp_t *pstTemp = NULL;
int *p = &(pstTemp->a);       // <<----- supposedly de-ref NULL pointer

return 0;
}
Run Code Online (Sandbox Code Playgroud)

上面指出的指令,我认为应该引起一个它没有的分段错误.我尝试使用"gcc -O0"省略默认的编译器优化.

当然,如果我用它替换它int i = pstTemp->a,我会得到一个段错误.我试图运行上面的程序throgh gdb来弄清楚发生了什么,以下是我的观察 -

(gdb) p pstTemp
$2 = (stTemp_t *) 0x0
(gdb) p pstTemp->a
Cannot access memory at address 0x0
(gdb) p &(pstTemp->a)
$3 = (int *) 0x0
Run Code Online (Sandbox Code Playgroud)

在这里$3,我们可以看到,当我尝试打印时&(pstTemp->a),它似乎被解释为一个地址,因此相当于int *p = NULL.

不过我怀疑的是,该声明是否应该(pstTemp->a)在生效之前得到评估并导致段错误?

c null pointers segmentation-fault dereference

4
推荐指数
1
解决办法
348
查看次数

标签 统计

c ×1

dereference ×1

null ×1

pointers ×1

segmentation-fault ×1