C标准的语言有时不是很清晰和一致。
calloc和使用不同的措辞malloccalloc:“calloc函数为一个arraynmemb对象分配空间,每个对象的大小为size。”malloc: “malloc函数为大小由size指定的对象分配空间”一般来说,数组也是一个对象。
我正在寻找精确的答案 - 而不是一般常识性的思考和现实生活中的用法。
是的,这两个函数都返回具有分配的存储持续时间的对象的内存。这在C 标准中关于对象存储持续时间的第 6.2.4p1 节中首次提到:
对象具有决定其生命周期的存储持续时间。有四种存储持续时间:static、thread、automatic和allocate。分配的存储在 7.22.3 中描述。
在第 7.22.3 节中,它进一步提到了数组和非数组对象:
通过连续调用aligned_alloc、calloc、malloc和realloc函数分配的存储的顺序和连续性是未指定的。如果分配成功,则返回的指针会被适当对齐,以便可以将其分配给具有基本对齐要求的任何类型对象的指针,然后用于访问分配的空间中的此类对象或此类对象的数组(直到空间被显式释放)。已分配对象的生命周期从分配开始一直延伸到释放为止。每个这样的分配都应产生一个指向与任何其他对象不相交的对象的指针。返回的指针指向分配空间的起始(最低字节地址)。如果无法分配空间,则返回空指针。如果请求的空间大小为零,则行为是实现定义的:返回空指针,或者行为就像大小是某个非零值,但返回的指针不得用于访问对象。
还应该注意的是,这些函数返回的内存在写入之前没有有效类型,这本质上意味着您可以在此类内存中存储任何您想要的内容。第 6.5p6 节对此进行了详细说明:
访问其存储值的对象的有效类型是该对象的声明类型(如果有)。87)如果通过类型不是字符类型的左值将值存储到没有声明类型的对象中,则该左值的类型将成为该对象的有效类型,用于该访问以及后续访问修改存储的值。如果使用 memcpy 或 memmove 将值复制到没有声明类型的对象中,或者复制为字符类型数组,则该访问以及不修改该值的后续访问的已修改对象的有效类型是从中复制值的对象的有效类型(如果有)。对于对没有声明类型的对象的所有其他访问,对象的有效类型只是用于访问的左值的类型。
87)分配的对象没有声明类型
| 归档时间: |
|
| 查看次数: |
84 次 |
| 最近记录: |