C 中的指针和局部变量

问题描述 投票:0回答:2

有人可以解释为什么这段代码有效吗:

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
应该指向什么都没有(空白区域)?显然这是不正确的,因为这段代码工作正常。有人能给我解释一下吗?

c pointers
2个回答
0
投票

代码似乎按预期工作,但正如您所写,它具有未定义的行为,并且可能导致其他任何结果,包括程序异常终止、不同的输出或系统故障。未定义的行为意味着任何事情都可能发生,包括预期的行为,这是最难调试的,因为行为在其他情况下可能会改变......


0
投票

要理解除了将其定义为 UB 之外的特定效果,您必须推理

y
变量的存储。它可能存储在
changeValue
函数的本地堆栈帧中。当该函数返回时,我们回到了
main
函数的堆栈帧中。此时,
y
变量确实超出了范围,但其相应的框架可能尚未被另一个函数调用覆盖。

© www.soinside.com 2019 - 2024. All rights reserved.