使用uint32_t *更改uint8_t数组的值

时间:2016-09-08 10:45:11

标签: c pointers memory

考虑我有两个无符号数,每个32位,保存在一个数组中。第一个数字包含在[0; 3]和第2位置[4; 8]。我现在改变其中一个数字的值,是下面的代码允许/有问题吗?

return eval(str(number)[::-1])

1 个答案:

答案 0 :(得分:1)

您可能无法使用指向uint8_t的指针访问uint32_t数组。这违反了the strict aliasing rule(反之亦然 - 如果uint8_t是字符类型)。

相反,您可能希望使用" type punning"来规避C(C99及以上)类型系统。为此,您使用union与相应类型的成员:

union TypePunning {
  uint32_t the_ints[2];
  uint8_t the_bytes[2 * sizeof(uint32_t)];
}
// now e.g. write to the_bytes[1] and see the effect in the_ints[0].
// Beware of system endianness, though!