有人可以解释为什么这段代码有效吗:
void changeValue(int **ptr) {
int y = 19;
*ptr = &y;
}
int main() {
int x = 14;
int *ptr = &x;
printf("%d\n", *ptr);
changeValue(&ptr);
printf("%d\n", *ptr);
return 0;
}
输出是
14
,19
,但是如何呢?据我了解 y
是局部变量,在函数完成后消失。那么 *ptr
应该指向什么都没有(空白区域)?显然这是不正确的,因为这段代码工作正常。有人能给我解释一下吗?
代码似乎按预期工作,但正如您所写,它具有未定义的行为,并且可能导致其他任何结果,包括程序异常终止、不同的输出或系统故障。未定义的行为意味着任何事情都可能发生,包括预期的行为,这是最难调试的,因为行为在其他情况下可能会改变......
要理解除了将其定义为 UB 之外的特定效果,您必须推理
y
变量的存储。它可能存储在 changeValue
函数的本地堆栈帧中。当该函数返回时,我们回到了 main
函数的堆栈帧中。此时,y
变量确实超出了范围,但其相应的框架可能尚未被另一个函数调用覆盖。