代码应该给分段错误...但它不是。为什么?

时间:2015-01-14 15:00:37

标签: c

在休眠代码中,指针ptr以整数变量为参考。什么时候说* ++ ptr它显示一个值而不是显示分段错误。

#include<stdio.h>
void main()
{
    int *ptr;
    int a=5;
    ptr=&a;
    printf("%p\n",&a);
    printf(" %d\n",*++ptr);
}

2 个答案:

答案 0 :(得分:11)

不保证未定义的行为会导致分段错误。

答案 1 :(得分:2)

在您的示例中,a是在堆栈上创建的自动变量。除非您即将耗尽堆栈,否则在a之后的地址几乎肯定会有更多可用内存。

在C中,++a将是a中包含的地址加上a指向的对象的大小,可能带有一些填充(取决于处理器的体系结构) 。这几乎肯定是进程地址空间中的有效地址,因为它也将在堆栈中。因此没有段错误。

尝试以下代码,看看你得到了什么。

#include<stdio.h>
int main()
{
    int *ptr;
    int a=5;
    int not_a=-1;
    ptr=&a;
    printf("%p\n",&a);
    printf(" %d\n",*++ptr);
    return 0;
}

(这可能不适用于所有体系结构或所有编译器。这取决于编译器如何处理自动变量的分配。)