|
|
1
21
不,新代码仍然有未定义的行为。 C11 6.3.2.3p7 以下内容:
它没有说明任何关于取消引用指针的内容—甚至转换也有未定义的行为。
实际上,您假设的修改后的代码是
手臂
-安全可能不公平
情报
-安全。已知编译器为
Intel that can crash on unaligned access
是的。虽然不是在链接的情况下,但聪明的编译器可能会将转换作为
证明
地址确实是对齐的,并使用专门的代码
除了对齐之外,您的第一个摘录还受到严格的别名冲突的影响。 C11 6.5p7 以下内容:
从阵列开始
也就是说,甚至
行为不明确。 |
|
|
2
8
为了安全地跨编译器/平台解析多字节整数, 可以提取每个字节,并根据尾数将它们组合成整数。例如,要从big endian buffer读取4字节整数:
|
|
|
3
4
有些编译器可能认为指针永远不会保存与其类型不正确对齐的值,并执行依赖于该值的优化。作为一个简单的例子,请考虑:
如果两者
|
|
|
4
2
正如antti haapala的回答中所提到的,当得到的指针没有正确对齐时,简单地将指针转换为另一种类型会调用c标准第6.3.2.3p7节中未定义的行为。
修改后的代码只使用
|
|
|
Rad · 点击下拉菜单按钮时,它会在框架内移动 1 年前 |
|
|
David Lytle · Javascript幻灯片对齐 2 年前 |
|
|
Riya · 如何将imageview放置在线性布局水平方向的右端 2 年前 |
|
|
Kris · 如何将视口外DIV与可见视口DIV完美对齐 2 年前 |
|
|
Ihsan Ahmad · 文本输入和复选框输入不对齐 3 年前 |
|
|
Dragynjump · 为什么对齐按钮中的项目会更改按钮的位置? 3 年前 |