#include <stdio.h>
void main() {
{
int x;
printf("%p\n", &x);
}
{
int x;
printf("%p\n", &x);
}
}
我认为运行它会两次输出相同的东西。当它声明第一个变量时,它会增加堆栈指针,然后离开范围,因此它会减少它,然后第二次重复该过程,因此两次int x
都会占用堆栈上的相同内存位置。
但事实并非如此。堆栈指针不会递减,并且int x
在这两种情况下都占用堆栈中的不同位置。事实上,第一个int x
仍然可以到达,即使它的范围已经消失了。
#include <stdio.h>
void main() {
{
int x = 10;
printf("%p\n", &x);
}
{
int x = 25;
printf("%p\n", &x);
}
{
int x = 71;
printf("%p\n", &x);
int *p = &x;
printf("%i %i %i\n", *(p + 2), *(p + 1), *p);
}
}
为什么是这样?我有什么误解?