c - 是 UB 将指针转换为 uint8_t 以读取 uint32_t 值吗?
问题描述
鉴于这个具体的例子
#include <stdio.h>
#include <stdint.h>
#include <inttypes.h>
int main(void)
{
uint8_t stuff[8] = {0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88};
int64_t bigint = *((int64_t *) stuff);
printf("bigint = %ld \n", bigint);
return 0;
}
我是否违反了 C11 标准?请注意,它似乎可以使用后来的 gcc 编译并使用“-Wall -Wextra -fstrict-aliasing -std=c11”编译,但例如 gcc 6.4 将发出警告“取消引用类型双关指针将破坏严格别名规则“这是我的理解所期望的。
在我的脑海中,安全的方法是执行始终安全的角色类型转换和内存复制。但是我想了解这是 UB 还是简单的实现定义;安全,但不便携。
解决方案
推荐阅读
- c# - 使用下拉菜单选择
- verilog - verilog异步时钟设计问题
- html - 使用 .htaccess 在 HTML 头部插入链接和元标记
- angular - 使用数据对象 Angular 传递数据
- laravel - 缓存具有所有关系的雄辩模型,然后将其转换回具有关系的模型?
- php - PHP -S 服务?“php -S localhost index.php”图像未显示在本地主机上的服务器上
- typescript - Winston Logger 不能在剧作家测试听众/记者之外工作
- javascript - 与嵌套数组对象中的列表 ID 和子列表 ID 匹配时添加另一个属性
- reactjs - 在验证 React 表单之前阻止导航
- python - Fiftyone 到 YOLO v5 的数据转换方法