在C语言中,如果不使用并集,如何将64字节的数组视为16整数的数组(反之亦然)?

在C语言中,如果不使用并集,如何将64字节的数组视为16整数的数组(反之亦然)?,c,arrays,pointers,types,type-conversion,C,Arrays,Pointers,Types,Type Conversion,所以,在我的程序中,我有一个变量 uint32_t buffer[16]; 然而,有时我需要将其视为 uint8_t char_buffer[64]; 最明显的解决办法是联合。然而,出于对知识的好奇,是否有其他方法告诉编译器我想将数组视为某种任意类型的数组?类似于 ((uint8_t *)buffer)[i] ?铸造方法是完美的。它将使编译器将数组视为整数数组。在你的特殊情况下,使用 ((uint32_t *)buffer)[index]; 然而,正如@JerryCoffin指出的,对齐

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

uint32_t buffer[16];
然而,有时我需要将其视为

uint8_t char_buffer[64];
最明显的解决办法是联合。然而,出于对知识的好奇,是否有其他方法告诉编译器我想将数组视为某种任意类型的数组?类似于

((uint8_t *)buffer)[i]

?铸造方法是完美的。它将使编译器将数组视为整数数组。在你的特殊情况下,使用

((uint32_t *)buffer)[index];

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

铸造方法是完美的。它将使编译器将数组视为整数数组。在你的特殊情况下,使用

((uint32_t *)buffer)[index];

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

ISO C99标准规定:

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

这意味着,如果
uint8\u t
typedef unsigned char
(如果系统中存在
uint8\u t
),那么代码必须工作:数组引用相当于取消引用的指针+整数加法


请注意,这仅在强制转换为
char
时有效。以另一种方式或其他方式进行铸造只能保证在您最终可以进行铸造的意义上起作用,并且最终将等于原始值。例如,您无法从32位长数组转换为16位短数组,并确保该标准下的任何内容,尽管它可能在大多数CPU/编译器组合的实践中工作。

ISO C99标准规定:

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

这意味着,如果
uint8\u t
typedef unsigned char
(如果系统中存在
uint8\u t
),那么代码必须工作:数组引用相当于取消引用的指针+整数加法


请注意,这仅在强制转换为
char
时有效。以另一种方式或其他方式进行铸造只能保证在您最终可以进行铸造的意义上起作用,并且最终将等于原始值。例如,您无法从32位长数组转换为16位短数组,并确保标准下的任何内容,尽管这可能在大多数CPU/编译器组合的实践中都有效。

您可以强制转换以强制将数组识别为另一种类型。转换有什么问题?谢谢大家,我以为我早就试过了,但没用。结果证明我错了,它很好用。不管怎样,我还是得到了一些好的信息。你可以使用它来强制数组被识别为其他类型。使用它有什么问题吗?谢谢大家,我想我之前试过了,但没有用。结果证明我错了,它很好用。不管怎样,还是得到了一些好的信息。不过对齐方面存在潜在问题。
char
缓冲区不一定要对齐以允许作为
uint32\u t
进行访问(尽管如果您使用
malloc
calloc
分配它,这将是有保证的)。谢谢大家提供的信息。如果我静态地将它分配为一个int数组,那么我应该不会有问题,对吧?不过对齐有一个潜在的问题。
char
缓冲区不一定要对齐以允许作为
uint32\u t
进行访问(尽管如果您使用
malloc
calloc
分配它,这将是有保证的)。谢谢大家提供的信息。如果我静态地将它分配为一个int数组,那么我应该没问题,对吧?+1。如果存在,
uint8\u t
unsigned char
。这是因为
char
至少有8位,不能有比
char
更窄的类型,并且两种类型都必须使用所有位,此处不允许使用填充位。+1。如果存在,
uint8\u t
unsigned char
。这是因为
char
至少有8位,不能有比
char
窄的类型,并且两种类型都必须使用所有位,此处不允许使用填充位。