示例代码:
#include <stdio.h>
int main (){
int *p;
{
int v = 1;
p = &v;
}
printf("%d\n", *p);
return 0;
}
此代码工作正常,但我不确定是否保证v的地址将被保留。
答案 0 :(得分:25)
无法保证。
一旦v
超出范围,任何事情(甚至通过指针)都会被视为Undefined Behavior。
与任何其他未定义的行为一样,仅仅因为它适用于一个操作系统,编译器,编译器版本,时间等,并不意味着它适用于另一个。
答案 1 :(得分:8)
要添加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”,这取决于使用的编译器和设置。
答案 2 :(得分:0)
你有时会工作,但不能确定它是否有效......它有时不仅会导致 总线错误,但甚至可能导致整个程序崩溃...
我会给你一个例子
看看这个...... http://www.functionx.com/cpp/examples/returnreference.htm
这里他试图返回一个超出范围的变量的引用...(大错误)..但是它有效....
你不能保证..它更好(不是更好的)永远不会返回超出范围的数据的引用