int *something() {
int x = 5;
int *b = &x;
return b;
}
int main() {
int z = *something()
printf("%d",z);
}
如果在堆栈上分配了名为something
的函数,那么它是如何工作的,然后在它返回值后移除int x和int * b
如果它们被删除,我们将无法推断something
返回的指针,因为它指向的是从堆栈中删除的int x
答案 0 :(得分:0)
您的问题是x
是一个临时变量,当它在something()
末尾超出范围时,尽管b
指向其地址,b
然后,当x
超出范围时,将指向未定义的内存,并且取消引用它将导致未定义的行为。
答案 1 :(得分:0)
这篇帖子似乎在问为什么这个有用。答案是,
是的,something
后局部变量不再有意义
退出,但指针仍指向某事。它指出了一点
可能包含任何内容的内存。所以你会得到一些输出。它
只是没有任何意义。
答案 2 :(得分:0)
函数本身未在堆栈中分配。
它有两个局部变量x和b。
该函数返回一个指向其局部变量x的指针,该函数在退出函数后被视为不存活。
然而,直到变量占用的内存不会被重写,变量的值才会出现在那里。
所以变量z可以得到它的值。
然而,一般来说,这是一种未定义的行为。