当前位置: 首页 > 知识库问答 >
问题:

使用uint32_t*改变uint8_t数组的值

苏鸿才
2023-03-14

假设我有2个无符号数字,每个32位,保存在一个数组中。第一个数字包含在位置 [0; 3] 中,第二个数字包含在位置 [4; 8] 中。我现在要更改其中一个数字的值,以下代码是否允许/有问题?

uint8_t array[8];
//...Fill it up...

uint32_t *ptr = NULL;
ptr = (uint32_t*)&array[0];
*ptr = 12345;

ptr = (uint32_t*)&array[4];
*ptr = 54321;

共有1个答案

师赤岩
2023-03-14

您不能访问带有指向uint32_t的指针的uint8_t数组。这违反了严格的混叠规则(反之亦然 - 如果uint8_t是字符类型)。

相反,您可能希望使用“类型双关”来避开C (C99及以上)类型系统。为此,您可以对相应类型的成员使用< code>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!
 类似资料:
  • uint8_t, uint16_t, uint32_t, uint64_t 是什么数据类型? 那么_t的意思到底表示什么?它就是一个结构的标注,可以理解为type/typedef的缩写,表示它是通过typedef定义的,而不是其它数据类型。 uint8_t,uint16_t,uint32_t 等都不是什么新的数据类型,它们只是使用typedef给类型起的别名,新瓶装老酒的把戏。不过,不要小看了ty

  • 我目前正在进行一个需要使用uint8_ t的项目。我发现了一个问题,有人能解释一下为什么会发生这种情况吗? 在这种情况下,输出是预期的 但是当我取消注释第一行并使用uint8_ t时,输出是 这种行为给我带来了麻烦。 谢谢你的帮助。 马雷克

  • 我有一个如下的C子程序, 我想要将数组A传递给上面提到的子例程, 问题是arrayA是类型uint8_tsub_data除了参数uint32_t我的要求是sub_data应该从arrayA中获取单个单词并在arrayB中存储为单个单词 所以最终的印刷品应该是, 我正在努力转换。我找到的所有解决方案是将arrayA的四个单词存储到arrayB的单个单词中。但我想把arrayA的一个词作为arrayB

  • 我编写此测试是为了将转换为

  • 老师们好, 请教一下把下面的数组转成char 数组 怎么转?

  • 问题内容: 我需要更改数组的大小,但是我不能简单地创建另一个数组- 它需要相同的名称,因此可以将其传递给方法。具体来说,我需要数组具有的术语数量是以前的两倍。这可能与一个数组有关吗?我可以将数据从数组A复制到数组B,然后在A = B时使A引用与B相同的数据吗?? 问题答案: 是的,您的数组变量可以引用相同类型但大小不同的数组。 对于内部更改,ArrayList可能更易于使用。