换句话说:如果我有一个以这种方式分配的数组,它是否可以保证:
void *arr = calloc(nmemb, sizeof(some_type))
然后elta
,eltb
,eltc
都将指向内存中的相同位置,这将是此数组的some_type
类型的第二个元素?
some_type *elta = &((some_type*)arr)[1];
some_type *eltb = ((some_type*)arr)+1;
some_type *eltc = (char*)arr+sizeof(some_type);
我问这个的原因是因为我试图在C中做一个“容器”,如果这不成立,那么我就没有想法如何返回指向除了之外的任何其他元素的指针第一个。
答案 0 :(得分:7)
是的,保证。 如果添加了填充字节,则会在 struct some_type
中添加,但不会在两个数组元素之间添加。
电子。 G:
struct S
{
int n;
short s;
// this is just for illustration WHERE byte padding (typically) would occur!!!
#if BYTE_ALIGNMENT >= 4
unsigned char : 0;
unsigned char : 0;
#endif
};
struct S s[2];
size_t d = (char*)(s + 1) - (char*)s;
将字节对齐调整为4或8(或更大的2的幂),此结构的大小为8,d将为8,字节对齐设置为1或2,结构的大小为6就像将... ...
注意:这不是唯一可以发生填充字节的地方:如果您切换了成员n
和s
,则s
和{{1}之间需要填充字节让n
正确对齐。另一方面,在n之后不再需要填充字节,因为结构大小已经确保正确对齐。
参考标准:C11,6.2.5.20:
数组类型描述了具有特定成员对象类型的连续分配的非空对象集,称为元素类型。 36)数组类型的特征在于它们的元素类型和数组中元素的数量。 [...]
(由我突出显示!)。