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

将char指针强制转换为int指针是一种未定义的行为吗?,c,undefined-behavior,C,Undefined Behavior,在某些来源中,我发现了以下内容: uint32\u t str\u hash=*(*uint32\u t)“CM1”; 我认为这是一种未定义的行为,因为 它抛弃了常数 类型双关 我错了吗?是否存在任何其他违规行为?将常量强制转换不是未定义的行为:仅对声明为常量的对象进行写入才是未定义的行为 除非您的平台的char类型是无符号的,否则是的,严格的别名禁止取消对指针的引用,并且行为是未定义的。然而,在现实世界中,考虑到大多数编译器对类型双关的普遍宽容,以及底层对象是const,它不太可能引起问题

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

uint32\u t str\u hash=*(*uint32\u t)“CM1”;

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

  • 它抛弃了常数
  • 类型双关

  • 我错了吗?是否存在任何其他违规行为?

    常量
    强制转换不是未定义的行为:仅对声明为
    常量
    的对象进行写入才是未定义的行为

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

    此外,在下面的评论中,davmac提出,
    “CM1”
    可能未与
    uint32\t
    所需的对齐方式对齐

    安全的方法是使用
    memcpy

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

    随着叮当声,这只是一个负载(我认为这是最好的,因为它可以得到)。尽管这不是一个需要考虑的问题,但也不能抛弃constance。

    这应该是
    *(uint32\u t*)“CM1”?(uint32_t)“CM1;-将被我在审查中拒绝,因为无法保证c字符串的字符指针对齐。您可能会导致读取不对齐。可以将“const”添加到强制转换中,这样就不会再将其丢弃。但是结果将是相同的。此外,我还希望有四个字符(假设一个简单的8位字符平台)第四个字符的形式为NULL,但不确定这是程序员打算使用的。如果字符串少于3个字符,则为未定义行为。类型双关不是自动未定义行为。字符串常量不是
    const
    。“严格的别名禁止此指针强制转换。”“-不,这并不禁止演员;它禁止取消对结果指针的引用。如果对齐不正确(本例中可能不正确),则可能会禁止强制转换,但这不是一个严格的别名问题。@davmac,为您解决了这个问题。