2012-08-09 82 views
0

可能重复:
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; 
} 

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

+0

你不了解什么? – 2012-08-09 04:24:36

+0

为什么内存地址相同?为什么ptr1会失去价值? – John 2012-08-09 04:26:16

+0

没有什么特别的原因,他们是一样的。他们恰好是。这只是平局的运气。至于为什么'ptr1'失去了价值,这是因为系统在释放后重新使用该内存来达到其他目的。 – 2012-08-09 04:26:48

回答

1

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

一旦内存不再使用,它​​可供重复使用。重新使用最近使用的内存通常是最有效的,因此这正是编译器和内存管理器通常要做的。

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

0

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

0

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

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

ptr2 = func2();使用相同的存储块,因为退出func1的后,该存储器块可以重复使用。

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