Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/unity3d/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 为什么此代码没有';t返回垃圾值?_C_Function_Pointers_Undefined Behavior - Fatal编程技术网

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注
可能的未定义行为包括完全忽略不可预测的情况 结果,在翻译或程序执行过程中,以文件化的方式表现为 环境(无论是否发出诊断消息),以终止翻译或 执行(发出诊断消息)

这是因为

关于C标准,“垃圾”值没有定义或概念(例如,可以称为垃圾或类似的值的范围)。该行为未定义,因此任何事情都可能发生。无法保证在调用UB后,程序会(或不会)继续执行以产生(或不产生)任何输出

相关,引用第§3.4.3章“未定义行为”中的
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;
}