使用malloced内存未定义写入前读取?

Aar*_*aid 9 c initialization undefined-behavior language-lawyer

根据这个reddit注释线程,如果在写入之前尝试读取内存,则它是未定义的.我指的是已经成功编写的普通堆内存malloc.

...请注意,这不是严格有效的C:允许编译器/运行时系统使用所谓的陷阱表示来初始化未初始化的内存,这会导致访问时出现未定义的行为.

我觉得很难相信.有标准报价吗?

当然,据我所知,无法保证内存已被清零.这个未初始化的存储器中的值基本上是伪随机的或任意的.但我真的不相信标准会将此称为未定义的行为(从某种意义上说它可能是段错误,或者删除所有文件,或者其他什么).其余的reddit线程在这个问题上没有任何更多的亮点.

oua*_*uah 11

如果通过a访问char*,则定义.但除此之外,这是未定义的行为.

(C99,7.20.3.3)"malloc函数为一个对象分配空间,该对象的大小由大小指定,其值是不确定的."

在不确定的价值:

(C99,3.17.2p1)"不确定值:未指定的值或陷阱表示"

在陷阱表示中通过非字符类型读取未定义的行为:

(C99,6.2.6.1p5)"某些对象表示不需要表示对象类型的值.如果对象的存储值具有这样的表示,并且由不具有字符类型的左值表达式读取,则行为为未定义.[...]这种表示称为陷阱表示."

  • @ouah,如果使用`char*`,它是明确定义的(但是任意/不确定)? (2认同)
  • @AaronMcDaid如果你取消引用`char*`yes:标准清楚地表明字符类型没有陷阱表示. (2认同)