#include <stdio.h>
int* function1(void);
int main()
{
int x = 10;
int *p = function1();
printf("%d\n", *p);
printf("%d\n", p);
}
int* function1(void)
{
int z;
z = 20;
z++;
return &z;
}
注意:代码块的GCC编译器已成功编译了程序,没有任何错误和警告。
答案 0 :(得分:1)
函数z
完成执行后,变量function1
不复存在。在函数main
中,您试图引用在函数调用后已释放的内存地址。这将导致未定义的行为。
答案 1 :(得分:1)
通常,您要做的是未定义。
但是,在英特尔架构上,z
在堆栈中,返回后,如果您不调用任何其他函数,则该值仍可能是 可用,因为尚未 重新使用内存。调用另一个函数后,内存将可能被覆盖,因此将为您包含垃圾。
通常:不要这样做!
答案 2 :(得分:0)
发生函数调用时,所有本地变量都将位于堆栈中。在函数调用期间,可以修改堆栈变量。当函数调用返回时,堆栈指针递减’
因此,您将无法以任何方式访问某些内容。 在编程语言中,这是由于行为不确定而解决的,因为您将覆盖编程语言的规则。
在这种情况下,假设您的堆栈框架仍然处于活动状态,并且未被任何其他代码修改,则可能会获得与写入该地址相同的值。
但还是不能保证,并且不要承担任何不能保证的事情。