将char指针转换为int指针是未定义的行为?

时间:2018-07-23 16:18:51

标签: c undefined-behavior

在某些来源中,我发现了以下内容:

uint32_t str_hash = *(*uint32_t)"CM1";

我相信这是未定义的行为,因为

  1. 它丢弃了const
  2. 键入punning

我错了吗?还有其他违规行为吗?

1 个答案:

答案 0 :(得分:3)

抛弃const并不是未定义的行为:仅写入声明为const的对象是未定义的行为。

除非平台的char类型是未签名的,否则,是的,严格的别名禁止取消引用指针,并且行为是未定义的。但是,在现实世界中,考虑到大多数编译器对类型修剪的宽大处理,并且基础对象是const,因此不太可能引起问题。

另外,在以下评论中,davmac提出"CM1"可能未与uint32_t所需的对齐方式保持一致。

执行此操作的安全方法是使用memcpy

uint32_t str_hash;
memcpy(&str_hash, "CM1", sizeof str_hash);

使用Clang,此compiles仅需加载一次(我认为它可以尽力而为)。也没有放弃constness,尽管这与存在无关紧要。