【发布时间】:2019-09-05 14:19:36
【问题描述】:
我有这个程序:
int* b;
{
int a = 5;
b = &a;
} //a gets destroyed here
{
int c = 7; //c replaces a?
printf("c: %d\n", c);
}
printf("*b: %d", *b); //*b is still 5
为什么 c 不替换 *b 或类似的东西?是不是因为一些编译器优化(我用clang编译,但是我用一些在线编译器试过,结果还是一样)
【问题讨论】:
-
为什么
c“替换”a?您通过取消引用指向超出范围的变量的指针来调用未定义的行为。 -
因为 a 已从堆栈中移除,而 c 应位于顶部,替换 a。
-
@EugeneSh。
a和c的范围不重叠并且它们具有相同的类型,因此人们可能期望编译器为它们分配相同的地址和/或注册。但当然,您实际上不允许做出这样的假设,并且代码会调用未定义的行为。 -
假设太多了。没有人保证它将从堆栈中删除。甚至没有人保证它会被放入堆栈。
-
基本上你是在问这个:“我用手指指着停车场上的一辆车。有人走进车里开走了。我仍然指着它停的地方。另一个不同的地方车进了停车场,怎么没有停在我指的地方?”好吧,为什么会这样?没有法律强制司机停在那里。或者在任何地方停车。
标签: c scope undefined-behavior lifetime