C 为什么此代码没有';t返回垃圾值?
编译时,当堆栈变量C 为什么此代码没有';t返回垃圾值?,c,function,pointers,undefined-behavior,C,Function,Pointers,Undefined Behavior,编译时,当堆栈变量q在堆栈帧被删除后消失时,此代码返回0 但是,作为一个悬空指针,我猜它也可能返回一些垃圾值 但是,我在不同的编译器上编译了它,它们都返回0。为什么会这样?这是因为 关于C标准,“垃圾”值没有定义或概念(例如,可以称为垃圾或类似的值的范围)。该行为未定义,因此任何事情都可能发生。无法保证在调用UB后,程序会(或不会)继续执行以产生(或不产生)任何输出 相关,引用第§3.4.3章“未定义行为”中的C11 1未定义的行为 使用不可移植或错误的程序结构或错误的数据时的行为, 本国际
q
在堆栈帧被删除后消失时,此代码返回0
但是,作为一个悬空指针,我猜它也可能返回一些垃圾值
但是,我在不同的编译器上编译了它,它们都返回0
。为什么会这样?这是因为
关于C标准,“垃圾”值没有定义或概念(例如,可以称为垃圾或类似的值的范围)。该行为未定义,因此任何事情都可能发生。无法保证在调用UB后,程序会(或不会)继续执行以产生(或不产生)任何输出
相关,引用第§3.4.3章“未定义行为”中的C11
- 1未定义的行为
- 2注
C11
- 1未定义的行为
- 2注
在这种情况下,将调用堆栈帧中的内存位置分配给
f
中的p
。调用printf
时,先前由f
使用的堆栈帧现在由printf
使用,在本例中,它被零覆盖
问题是,您在
f
中分配了一个稍后无效的内存位置,因为在函数返回后,您不能访问函数的变量。在这种情况下,您将调用堆栈帧中的内存位置分配给f
中的p
。调用printf
时,先前由f
使用的堆栈帧现在由printf
使用,在本例中,它被零覆盖
问题是,您在
f
中分配了一个稍后无效的内存位置,因为在函数返回后,您不能访问函数的变量。未定义的行为是未定义的行为。另请参阅与您的question@BasileStarynkevitch这里有很好的解释,特别是第2点和第5点:)未定义的行为是未定义的行为。另请参见与您的question@BasileStarynkevitch这里解释得很好,特别是第2点和第5点:)完美精确的解释!!完美精确的解释!!
void f(int **pp)
{
int q = 10;
*pp = &q;
}
int main()
{
int a = 5;
int *p = &a;
f(&p);
printf("%d", *p);
return 0;
}