2011-08-18 73 views
0

可能重复:
Can a local variable's memory be accessed outside its scope?函数返回后本地内存地址是否有效?

我是令人耳目一新有关如何存储在内部工作原理的知识,我所面临的困惑。下面是示例代码

int * func(){ 
    int retval = 3; 
    return &retval; 
} 

int main(void){ 
    int *ptr = func(); 
    printf("address return from function %p and value %d\n", ptr, *ptr); 
} 

我的理解对于如何堆栈存储器上的日常工作,是当一个函数被调用,它被压入堆栈。一旦函数返回,此例程中局部变量的生存期将不再有效。所以返回局部变量的地址似乎是无效的,但是当我测试这个代码时,它实际上返回它的地址,并且在函数返回后仍然有效。

我误解了这个概念吗?赞赏任何意见,谢谢。

+0

总之,你在做什么是无效的,但这并不意味着它不会在某些情况下工作。 –

+0

// @Peter提到的dupe包含我见过的最好的答案之一,有近2000个upvotes .. – amit

+1

无效和不工作是两个不同的事情。直到数据被覆盖(通过另一个函数调用),即使您不应该也可以访问它。如果你在'func'和'printf'之间调用了另一个函数,你会得到一些其他的数字,而不是3. – ughoavgfhw

回答

3

“测试代码”不是确定某件事是否有效的有意义的方法。你的代码产生未定义的行为。未定义行为的一种可能表现是代码可能似乎是“正在工作”。换句话说,你只是很幸运。

要回答这个问题:no,返回一个指向局部变量的指针是无效的,并且它不能有效的取消引用这样一个指针。任何尝试这样做都会导致未定义的行为。

+0

只是返回它并不是无效的,至少在将它转换为整数类型时不是无效的。这可能是一个有用的(弱,但仍然潜在有用)的熵源 - 本质上,从系统的ASLR收集熵。 –

+0

请注意,有些人**错误地将指针取消引用,因为它不再有效作为熵源。这不是合法的C,一个实现是完全合理的,使这种使用崩溃。但我的例子是合法的。 –