【发布时间】:2012-02-09 22:36:34
【问题描述】:
根据this reddit comment thread,如果在写入内存之前尝试读取内存,则未定义。我指的是正常的堆内存,它已经成功malloced。
...请注意,这不是严格有效的 C:允许编译器/运行时系统使用所谓的陷阱表示来初始化未初始化的内存,这会导致访问时出现未定义的行为。
我觉得这很难相信。有标准报价吗?
当然,我知道无法保证内存已清零。此未初始化内存中的值本质上是伪随机或任意的。但我真的不敢相信标准会将此称为未定义的行为(从某种意义上说,它可能会出现段错误,或删除所有文件,或其他任何东西)。那里的其他 reddit 线程没有进一步说明这个问题。
【问题讨论】:
-
呃,你认为未定义的行为是什么意思? (是的,在初始化之前使用分配的内存会产生未定义的行为)
-
@Brian 我假设他在问整个行为(即这个段错误)是否未定义,或者只是读取结果的值。
-
@Owen,没错,我已经相应地更新了问题。
-
你不能有未定义的子集。这意味着行为未定义。会出现段错误吗?谁知道;行为是未定义。这并不意味着它会出现段错误或删除您的文件,事实上,它可能不会做任何坏事......但你不能依赖它,因为没有什么可以说它不会' t.
-
内存是不确定的,这在非规范附件 J(可移植性)中被列为未定义行为,但我找不到任何规范明确说明访问不确定内存是 UB
标签: c undefined-behavior language-lawyer initialization