换句话说:如果我有一个以这种方式分配的数组,是否可以保证:
void *arr = calloc(nmemb, sizeof(some_type))
Then elta
, eltb
, eltc
都将指向内存中的同一位置,这将是 type 的第二个元素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 语言创建一个“容器”,如果这不成立,那么我就不知道如何返回指向第一个元素之外的任何其他元素的指针。
是的,这是有保证的。If添加填充字节,添加它们within struct some_type
,但不在两个数组元素之间。
E. 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
and s
,之间需要填充字节s
and n
to get n
正确对齐。另一方面,n 之后不再需要填充字节,因为结构大小已经确保了正确的对齐。
参照标准:C11,6.2.5.20:
数组类型描述了一个连续分配具有特定成员对象类型(称为元素类型)的非空对象集。 36) 数组类型的特征在于其元素类型和数组中元素的数量。 [...]
(由我突出显示!)。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)