在休眠代码中,指针ptr以整数变量为参考。什么时候说* ++ ptr它显示一个值而不是显示分段错误。
#include<stdio.h>
void main()
{
int *ptr;
int a=5;
ptr=&a;
printf("%p\n",&a);
printf(" %d\n",*++ptr);
}
答案 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;
}
(这可能不适用于所有体系结构或所有编译器。这取决于编译器如何处理自动变量的分配。)