为什么这个函数返回垃圾值

我正在编写一个程序并面临这个问题,以下函数用于返回垃圾值:

int* foo(int temp){ int x = temp; return &x; } 

当我修改它时,它工作正常:

 int* foo(int *temp){ int *x = temp; return x } 

第一个版本出了什么问题?

第一个版本返回对局部变量x的引用,其存储仅限于函数foo 。 当函数退出时,不能再使用x 。 返回对它的引用是悬空指针的一个实例。

在第二个版本中,您实际上只传入并返回相同的指针值,该值指的是不受函数生命周期限制的内存。 因此,即使函数退出,返回的地址仍然有效。

另一种选择:

 int *foo(int temp) { int *x = malloc(sizeof(int)); *x = temp; return x; } 

对于每个函数,都会有一个激活记录,一旦该函数的执行开始,它将在堆栈中创建。 激活记录也包含所有局部变量。 一旦函数执行完成,这个激活记录将被释放。

因此,如果我们返回一个局部变量的地址意味着,那将释放先前函数的激活记录的内存。 取消引用该memrory是一种未定义的行为。

在下面的例子中,函数foo返回&x表示p将保存func的局部变量x的地址。 这是有效的。 但是如果函数func尝试重新生成无效的p (地址x )。

 int* func { int x; int *p; ... p = foo(&x); //using p is valid here ... return p; //This is invalid } int* foo(int *temp) { int *x = temp; return x //This is valid } 

在下面的例子中,funciton foo将其局部变量x地址返回到函数func 。 所以p将保存foo的局部变量的地址。 所以引用p是无效的,因为foo函数执行已经完成并且其激活记录被释放。

 int* func { int x; int *p; ... p = foo(x); //using p is invalid here ... return p; //This is invalid } int* foo(int temp) { int x = temp; return &x; //This is also invalid }