为什么返回未初始化的值被视为未定义行为?

2024-02-01

在读的时候this http://en.cppreference.com/w/c/language/behavior#UB_and_optimization我看到一个UB不太明白,希望你能解释一下

size_t f(int x)
{
    size_t a;
    if(x) // either x nonzero or UB
        a = 42;
    return a; 
}

我猜UB是因为a没有初始化值,但这不是它定义的行为吗?意义,f(0)将返回变量保存的值a,无论它是什么(我认为这就像rand())。我们必须知道代码片段返回什么值才能使代码具有明确定义的行为吗?


意思是, f(0) 将返回变量 a 所保存的值,无论它是什么......

嗯,就你的情况而言,

  • a是自动局部变量
  • 它可以有陷阱表示 https://stackoverflow.com/q/6725809/2173917
  • 它的地址没有被占用。

所以,是的,根据定义,这会导致未定义的行为 https://en.wikipedia.org/wiki/Undefined_behavior.

Quoting C11,第 §6.3.2.1 章

[...] 如果 左值指定一个具有自动存储持续时间的对象,该对象本来可以 使用寄存器存储类声明(从未获取其地址),并且该对象 未初始化(未使用初始化器声明且未对其进行赋值 在使用之前执行),该行为是未定义的。


  • 与“为什么未定义的行为是未定义的”相关,请参见这个帖子 https://stackoverflow.com/q/949433/2173917.
  • 有一个关于陷阱表示和未定义行为的非常好的答案,一探究竟 https://stackoverflow.com/a/25074258/2173917.
  • 最后,中间有一个细衬里UB 和不确定值的使用 https://stackoverflow.com/q/11962457/2173917.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么返回未初始化的值被视为未定义行为? 的相关文章

随机推荐