首页 > 解决方案 > 是 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 还是简单的实现定义;安全,但不便携。

标签: cc11

解决方案


推荐阅读