假设我有这个数组:
uint8_t arr[10];
Run Code Online (Sandbox Code Playgroud)
位于地址0x00.
然后我想将其中的一部分分配给uint32_t值.arr [1],arr [2],arr [3]和arr [4]的聚合为32位整数.这是一个例子:
uint8_t arr[10];
uint32_t i;
i = *( (uint32_t *)&arr[1] );
Run Code Online (Sandbox Code Playgroud)
困扰我的arr[1]是位于地址不是四的地址(地址0x01).所以问题是:32位平台会发生什么?这是否合法,与标准uint32作业相比是否有一些缺点?
这是非法的,因为它违反了严格的别名规则,导致未定义的行为.
memcpy改为使用:
memcpy(&i, &arr[1], sizeof(i));
Run Code Online (Sandbox Code Playgroud)
但请注意,此代码假定主机字节序.如果您需要与字节顺序无关的代码,请使用位移和屏蔽将4个值组合成整数,或者在之后交换字节memcpy(编译器通常会为此提供某种类型的内插).