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

CIs*_*ies 3 c initialization undefined-behavior

在阅读本文时,我看到了一个我不了解的UB,希望您能澄清一下

size_t f(int x)
{
    size_t a;
    if(x) // either x nonzero or UB
        a = 42;
    return a; 
}
Run Code Online (Sandbox Code Playgroud)

我猜UB是由于a没有初始化的值,但这不是它定义的行为吗?意思是,无论f(0)变量a是什么, 都将返回其所保存的值(我认为这类似于rand())。我们是否必须知道代码片段返回的值使代码具有明确定义的行为?

Sou*_*osh 5

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

好吧,就您而言

  • a 是自动局部变量
  • 它可以有陷阱表示
  • 它没有地址。

因此,是的,根据定义,这会导致未定义的行为

引用C11第6.3.2.1章

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


  • 与“为什么未定义行为未定义”相关,请参阅此帖子
  • 关于陷阱表示和不确定的行为,有一个很好的答案,请查看
  • 最后,在UB和不确定值的使用之间有一个很好的界限。

  • @CIsForCookies请仔细,完整地阅读和理解本文。不要只选择一些关键字! (2认同)