为什么在段错误的下一行调用&p会让上一行的报错也消失?

来源:1-3 C语言中的特殊指针

黑鸽

2023-07-15 19:55:15

#include <stdio.h>

int main()
{
    int *p;
    
    *p = 800;
    
    printf("*p = %d\n", *p);
    return 0;
}

在这段代码中,报 

    Segmentation fault (core dumped)

错误的应该是

    *p = 800;

这一行吧,但是我在这行后面加一句&p的打印,代码就变的没有问题了,是为什么?

即:

#include <stdio.h>

int main()
{
    int *p;
    
    *p = 800;
    
    printf("&p = %p\n", &p);
    printf("*p = %d\n", *p);
    return 0;
}

打印结果显示 *p=800也是赋值成功的:

&p = 0x7ffc1a6707a0

*p = 800


另外,我之前的是这样写的:

#include <stdio.h>

int main()
{
    int *p;
    
    &p
    *p = 800;
    
    printf("*p = %d\n", *p);
    return 0;
}

我的理解是在报错代码之前调用了&p,是不是导致了p指针的初始化,打印显示默认初始化的*p是1,这样就不会出现野指针错误,但是上面的代码是在报错代码之后调用的&p,为什么也会导致报错消失了?有点不理解!

写回答

1回答

大白老师

2023-07-15

这个应该是编译器优化的问题,不管添加不添加&p,理论上都是段错误的!这个应该是编译器的问题!你可以换个平台和编译器测试!应该会提示错误
0

物联网/嵌入式工程师

面向零基础保姆式教学+简历指导+1V1模拟面试+3次内推,助力轻松就业!

394 学习 · 1207 问题

查看课程