分配给另一个函数的局部变量的自动存储类变量的地址

时间:2018-09-26 10:47:39

标签: c

#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;
}
  • 变量'z'对于'function1'是局部的,并且在变量之后不存在。 “功能1”已终止。
  • 现在要访问变量“ z”的存储空间中的值, 该函数返回的地址。
  • 因此,即使终止后,变量的存储空间也会 当指针访问变量时,'z'仍将保留?在这种情况下,存储空间的属性是什么?
  • 或者如果其他变量分配了相同的内存空间怎么办 'z'的变量?

注意:代码块的GCC编译器已成功编译了程序,没有任何错误和警告。

3 个答案:

答案 0 :(得分:1)

函数z完成执行后,变量function1不复存在。在函数main中,您试图引用在函数调用后已释放的内存地址。这将导致未定义的行为。

答案 1 :(得分:1)

通常,您要做的是未定义

但是,在英特尔架构上,z在堆栈中,返回后,如果您不调用任何其他函数,则该值仍可能是 可用,因为尚未 重新使用内存。调用另一个函数后,内存将可能被覆盖,因此将为您包含垃圾。

通常:不要这样做!

答案 2 :(得分:0)

发生函数调用时,所有本地变量都将位于堆栈中。在函数调用期间,可以修改堆栈变量。当函数调用返回时,堆栈指针递减

因此,您将无法以任何方式访问某些内容。 在编程语言中,这是由于行为不确定而解决的,因为您将覆盖编程语言的规则。

在这种情况下,假设您的堆栈框架仍然处于活动状态,并且未被任何其他代码修改,则可能会获得与写入该地址相同的值。

但还是不能保证,并且不要承担任何不能保证的事情