通过memcpy创建陷阱表示并提取数据的合法性问询
问题解答
核心结论
该程序不会触发未定义行为,且最后的assert测试能够可靠通过。
具体分析
陷阱表示的存在不触发未定义行为
C标准明确规定,仅存储陷阱表示而不读取其值是合法的。未初始化变量本身就可能包含陷阱表示,只要不访问这些变量的值,就不会产生未定义行为,这和你提到的逻辑一致。memcpy的字节级复制保证一致性memcpy是纯粹的字节级复制操作,不关心目标内存对应的类型语义。第一次memcpy会把original_data的所有字节原样写入float_array的内存空间,无论这些字节是否构成float的有效表示(包括陷阱表示)。只要两次memcpy之间,float_array对应的内存区域没有被其他操作修改(程序明确说明不会访问数组的float值,自然也不会修改),第二次memcpy就会将该区域的字节原样复制回extracted_data。陷阱表示不会自发变更
C标准中没有任何规则允许陷阱表示在未被主动修改的情况下自行变化。内存中的字节在没有写入操作的前提下,会保持其存储的内容——这是内存模型的基本前提,和这些字节是否对应某个类型的有效表示无关。
关键前提
必须严格遵守绝不访问float_array中元素的float值这一条件。如果出现读取陷阱表示值的操作(比如打印float_array的元素),就会立刻触发未定义行为。但程序中仅通过memcpy操作内存字节,完全避开了值的访问,因此是安全的。
内容的提问来源于stack exchange,提问作者Jackson Allan
相关产品推荐
相关产品推荐

