0

可能重复:
可以在其范围之外访问局部变量的内存吗?

我试图了解为什么我会为以下程序获得此输出

[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;
}

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

4

3 回答 3

1

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

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

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

于 2012-08-09T04:25:28.083 回答
0

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

于 2012-08-09T04:26:51.257 回答
0

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

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

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

     prt2
      ↓
prt1→[w][o][r][l][d][\0]
      ↑
    0xbfde68f4
于 2012-08-09T04:33:39.757 回答