示例代码:
#include <stdio.h>
int main (){
int *p;
{
int v = 1;
p = &v;
}
printf("%d\n", *p);
return 0;
}
这段代码可以正常运行,但我不确定是否有保证 v 的地址会被保留。
没有任何保证。
一旦v
超出其作用域,任何与它相关的操作(即使是通过指针进行)都被视为未定义行为。
与其他未定义行为一样,仅因其在一个操作系统、编译器、编译器版本或某个特定时间运行良好,并不意味着它会在另一个上也能正常工作。
在Merlyn的回答基础上,有一种情况可能会导致您没有预期的结果:
#include <stdio.h>
int main (){
int *p;
{
int v = 1;
p = &v;
}
{
int w = 2;
printf("%d\n", w);
}
printf("%d\n", *p);
return 0;
}
v
和w
的内存空间来进行优化。但是,编译器可能不会对此进行优化 - 这就是为什么在其封闭块结束后使用指向变量的指针的行为未定义的原因。程序可能会输出"2"和"1",或者"2"和"2",或者"2"和完全不同的内容,这取决于使用的编译器和设置。是的,有时它会起作用,但人们不能确定它是否有效... 它有时不仅会导致总线错误,甚至可能导致整个程序崩溃...
我会给你一个例子
看一下这个... http://www.functionx.com/cpp/examples/returnreference.htm
在这里,他试图返回一个超出范围的变量的引用...(大错特错)...但它确实起作用...
你无法保证...所以最好(不是更好)永远不要返回超出范围的数据的引用。