返回局部变量的地址

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

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

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

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

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

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

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

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

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

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

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

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