malloc分配的内存是数组吗?与calloc分配的内存相同吗?

3
C标准的语言有时并不清晰和一致。
1. 通过malloc分配的对象是否是数组。常识告诉我们是,但标准对calloc和malloc使用了不同的措辞。
- calloc: "calloc函数为nmemb个大小为size的数组对象分配空间。" - malloc: "malloc函数为大小由size指定的对象分配空间。"
通常,数组也是一个对象
我正在寻找准确的答案,而不是一般的常识思考和实际用法。

似乎与这个问题非常相关:https://stackoverflow.com/questions/77243945/pointer-comparison-in-c。这是触发这个问题的原因吗?我在那里的回答也涵盖了这个问题。简而言之,它在形式上不是一个数组,但必须像对待数组一样处理,否则整个C语言就会变得毫无意义。 - undefined
@Lundin,我之前发布了一个相关的问题question。如果字面上理解标准,几乎世界上每一行C代码都会变得不确定。 - undefined
1个回答

5
是的,这两个函数都为具有分配存储期的对象返回内存。这在《C标准》的6.2.4p1节中首次提到,关于对象的存储期:

对象具有决定其生命周期的存储期。有四种存储期:静态、线程、自动和分配。分配的存储在7.22.3中有描述。

而在7.22.3节中进一步提到了数组和非数组对象。
连续调用aligned_alloc、calloc、malloc和realloc函数分配存储空间的顺序和连续性是未指定的。如果分配成功,返回的指针将被适当地对齐,以便可以将其分配给任何具有基本对齐要求的对象类型的指针,然后用于访问该对象或该对象数组在分配的空间中(直到显式释放空间)。分配的对象的生命周期从分配开始到释放结束。每次分配都应返回一个与任何其他对象不相交的对象的指针。返回的指针指向分配空间的起始位置(最低字节地址)。如果无法分配空间,则返回空指针。如果请求的空间大小为零,则行为是实现定义的:要么返回空指针,要么行为就像大小为非零值一样,只是返回的指针不得用于访问对象。
需要注意的是,这些函数返回的内存在写入之前没有“有效类型”,这意味着您可以在这些内存中存储任何您想要的内容。这在第6.5p6节中有详细说明:
“对于访问其存储值的对象,其有效类型是对象的声明类型(如果有)。如果通过具有非字符类型的lvalue将值存储到没有声明类型的对象中,那么lvalue的类型将成为该访问和不修改存储值的后续访问的对象的有效类型。如果使用memcpy或memmove将值复制到没有声明类型的对象中,或者将其作为字符类型的数组复制,那么修改后的对象的有效类型以及不修改值的后续访问的有效类型将是从中复制值的对象的有效类型(如果有)。对于对没有声明类型的对象的所有其他访问,对象的有效类型只是用于访问的lvalue的类型。”
“分配的对象没有声明类型。”

我认为真正的问题是在对象的有效类型设置之前是否允许指针算术运算。int *p = malloc(1000); p[10] = 42; 这段代码是否被定义。 - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接