gpt4 book ai didi

c - C标准是否要求n个元素数组的大小是元素大小的n倍?

转载 作者:太空狗 更新时间:2023-10-29 16:23:51 25 4
gpt4 key购买 nike

C 标准是否要求n 个元素的数组的大小是元素大小的n 倍,无论是通过显式声明还是通过严格的逻辑推导它的要求?

例如,int (*x)[5] = malloc(5 * sizeof **x); 可能无法为包含五个 int 的数组请求足够的空间>?

C 2011 [N1570] 6.5.3.4 7 显示了计算数组中元素数量的示例,如 sizeof array/sizeof array[0]。但是,示例不是标准的规范部分(根据前文第 8 段)。

6.2.5 20 表示数组类型描述了一组连续分配的具有特定类型的非空对象,但没有说明所需的总内存。

这只是一个语言律师问题;实际实现无关紧要。 (为了安抚那些想要具体示例的人,假设一个 C 实现需要对大型数组进行额外的内存管理,因此创建数组需要创建一些额外的数据来帮助管理内存。)

最佳答案

是的,要求数组T[n]的大小为n * sizeof (T)

标准在 §6.2.5/20 中定义数组:

An array type describes a contiguously allocated nonempty set of objects with a particular member object type....

此外,sizeof 运算符生成数组中的总字节数 ( §6.5.3.4/4 ):

When sizeof is applied .... to an operand that has array type, the result is the total number of bytes in the array. When applied to an operand that has structure or union type, the result is the total number of bytes in such an object, including internal and trailing padding.

由于数组由连续分配的对象组成,因此不能有内部填充。由于尾部填充仅在 union 和结构的上下文中针对 sizeof 运算符明确提及,因此很明显数组不应具有此类尾部填充。

最后,请注意 §6.2.6.1/4声明:

Values stored in non-bit-field objects of any other object type consist of n x CHAR_BIT bits, where n is the size of an object of that type, in bytes. The value may be copied into an object of type unsigned char [n] (e.g., by memcpy); the resulting set of bytes is called the object representation of the value.

假设数组可能有尾部填充字节,考虑数组unsigned char A[n],并进一步考虑数组unsigned char B[sizeof A ]A[] 的所有字节(包括可能的填充字节)都已复制到其中。现在,A[] 必须B[] 大小相同,因为 ( §6.2.6.1/8 ):

Where an operator is applied to a value that has more than one object representation, which object representation is used shall not affect the value of the result.

这意味着 B[] 必须 没有尾部填充,这意味着数组可以有尾部填充字节,除非在某些特殊情况下没有提及标准,或者数组可能有尾部填充,unsigned char 数组除外。由于标准中未提及这两种可能性,因此可以合理地得出结论,数组一开始就不能有尾部填充。

关于c - C标准是否要求n个元素数组的大小是元素大小的n倍?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47522295/

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