代码之家  ›  专栏  ›  技术社区  ›  mauro

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

  •  -1
  • mauro  · 技术社区  · 6 年前

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

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

    我认为这是一种未定义的行为,因为

    1. 它抛弃了警察
    2. 类型双关

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

    1 回复  |  直到 6 年前
        1
  •  3
  •   zneak    6 年前

    铸造 const away不是未定义的行为:仅写入声明的对象 康斯特 是未定义的行为。

    除非你的平台 char 类型是无符号的,然后是,严格的别名禁止取消对指针的引用,并且行为是未定义的。然而,在现实世界中,考虑到大多数编译器对类型punning的一般宽容,并且考虑到底层对象是const,它不太可能引起问题。

    此外,在下面的评论中,Davmac提出 "CM1" 可能与 uint32_t 所需的对齐方式。

    这样做的安全方法是使用 memcpy :

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

    有了Clang,这个 compiles 只有一个负载(我认为是尽可能好的)。也没有逃避警察,尽管这不是一个问题。