返回局部变量的地址

时间:2012-08-09 04:21:03

标签: c pointers

  

可能重复:
  Can a local variable's memory be accessed outside its scope?

我试图理解为什么我得到以下程序的输出

[hello] [0xbfde68f4]
[world] [0xbfde68f4]
[world] [0xbfde68f4]

该计划

int main(void)
{
    char **ptr1 = NULL;
    char **ptr2 = NULL;

    ptr1 = func1();
    ptr2 = func2();
    printf(" [%s] [%p]\n",*ptr1, (void*)ptr1);

    printf(" [%s] [%p]\n",*ptr2, (void*)ptr2);

    printf(" [%s] [%p]\n",*ptr1, (void*)ptr1);

    return 0;
}

char** func1()
{
    char *p = "hello";
    return &p;
}

char** func2()
{
    char *p = "world";
    return &p;
}

我知道返回局部变量的地址不是一个好习惯,但这只是一个实验。

3 个答案:

答案 0 :(得分:1)

重新使用内存地址。首先,它保持持有“hello”的常量的地址,然后重新用来保存持有“世界”的常量的地址。

一旦内存不再使用,可以重复使用。重新使用最近使用的内存通常是最有效的,因此编译器和内存管理器通常会尝试这样做。

请注意,绝对不能保证。您可能会发现此程序在不同的编译器或平台上崩溃或提供不同的地址。但是,在这种特定情况下非常非常可能重用,因为两个变量都是本地的并且在堆栈上分配,并且没有中间代码使用任何堆栈空间。如果您添加堆叠空间的干预使用,您将获得不同的行为。

答案 1 :(得分:0)

局部变量存在于堆栈中。当你调用func1()时,创建了局部变量,然后当它超出范围时被销毁。 func2()为其局部变量使用了相同的空格,因为func1()不再使用它了。

答案 2 :(得分:0)

ptr1 = func1();使用如下的内存块。

prt1
 ↓
[h][e][l][l][o][\0]
 ↑
0xbfde68f4

ptr2 = func2();使用相同的内存块,因为在退出func1后,可以重用此内存块。

     prt2
      ↓
prt1→[w][o][r][l][d][\0]
      ↑
    0xbfde68f4