将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,为您解决了这个问题。