如何在不使用联合的情况下将C中的64个字节的数组视为16个整数的数组(反之亦然)?

时间:2012-06-14 03:51:05

标签: c arrays pointers types type-conversion

所以,在我的程序中,我有一个变量

uint32_t buffer[16];

但是,有时我需要将其视为

uint8_t char_buffer[64];

最明显的解决方案是工会。然而,出于好奇心,是否有另一种方法告诉编译器我想将数组视为某种任意类型的数组?

的内容
((uint8_t *)buffer)[i]

2 个答案:

答案 0 :(得分:4)

铸造方法是完美的。它使编译器将数组视为一个int数组。在您的特例中,请使用

((uint32_t *)buffer)[index];

正如@JerryCoffin指出的那样,有一个对齐的探针。如果静态地将数组静态分配为char [],则它不一定是4字节对齐(整数需要)。如果您确定要避免此问题,请使用malloc(),因为它可以保证适当的alginment。

答案 1 :(得分:3)

ISO C99标准说:

  

当指向对象的指针转换为指向字符类型的指针时,结果指向对象的最低寻址字节。结果的连续增量,直到对象的大小,产生指向对象剩余字节的指针。

这表示如果uint8_ttypedef unsigned char(并且系统中必须存在uint8_t),那么您的代码必须正常工作:数组引用相当于已取消引用指针+ int加法。

请注意,仅当将转换为 char时才有效。以其他方式或其他任何方式进行投射只能保证在最终可以退回的意义上工作,并且最终将等于原始值。例如,您无法从32位长的数组转换为16位短路数组并确保标准下的任何内容,尽管它可能适用于大多数CPU /编译器组合。