在某些来源中,我发现了以下内容:
uint32_t str_hash = *(*uint32_t)"CM1";
我相信这是未定义的行为,因为
我错了吗?还有其他违规行为吗?
答案 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,尽管这与存在无关紧要。