gpt4 book ai didi

c - 是否保证 C 中的数组元素将连续存储,没有填充?

转载 作者:太空狗 更新时间:2023-10-29 16:00:53 24 4
gpt4 key购买 nike

换句话说:如果我有一个这样分配的数组,是否可以保证:

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 中做一个“容器”,如果这不成立,那么我不知道如何返回指向任何其他元素的指针而不是第一个。

最佳答案

是的,这是有保证的。 如果 添加了填充字节,它们将添加到 struct some_type 中,但不会添加到两个数组元素之间。

E.例如:

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就像 d...

注意:这不是唯一可以出现填充字节的地方:如果您切换成员 ns,则在 之间需要填充字节n 使 n 正确对齐。另一方面,在 n 之后不再需要填充字节,因为结构大小已经可以确保正确对齐。

参照标准:C11,6.2.5.20:

An array type describes a contiguously allocated nonempty set of objects with a particular member object type, called the element type. 36) Array types are characterized by their element type and by the number of elements in the array. [...]

(由我突出显示!)。

关于c - 是否保证 C 中的数组元素将连续存储,没有填充?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43766161/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com