C标准的语言有时不是很清晰和一致。1.是一个由malloc分配的数组对象。常识告诉我们是的,但标准对calloc和malloc使用了不同的措辞
calloc
malloc
array
一般来说,一个 array 也是一个 object。我在寻找精确的答案--而不是一般的常识性思考和现实生活中的用法。
4xrmg8kj1#
是的,这两个函数都为具有 * 分配的存储持续时间 * 的对象返回内存。这在C standard的第6.2.4p1节关于对象的存储持续时间中首次提到:对象具有决定其生存期的存储持续时间。有四种储存时间:static、thread、automatic 和 allocated。已分配的存储在7.22.3中描述。在第7.22.3节中,它提到了数组和非数组对象:通过连续调用 aligned_alloc、calloc、malloc 和 realloc 函数分配的存储的顺序和连续性未指定。如果分配成功,则返回的指针被适当地对齐,以便它可以被分配给指向具有基本对齐要求的任何类型的对象的指针,然后用于访问分配的空间中的此类对象或此类对象的数组(直到空间被显式地释放)。已分配对象的生存期从分配开始一直到释放结束。每个这样的分配将产生一个指向与任何其他对象不相交的对象的指针。返回的指针指向所分配空间的开始(最低字节地址)。如果无法分配空间,则返回空指针。如果请求的空间大小为零,则行为是实现定义的:要么返回空指针,要么行为就好像大小是某个非零值,只是返回的指针不应用于访问对象。还应该注意的是,这些函数返回的内存在写入之前没有 * 有效类型 *,这实质上意味着你可以在这些内存中存储任何你想要的东西。这在第6.5p6节中详细说明:对象的有效类型是该对象的声明类型(如果有的话),用于访问其存储值。87)如果一个值通过一个不是字符类型的左值被存储到一个没有声明类型的对象中,那么左值的类型就成为该对象的有效类型,用于该访问和不修改存储值的后续访问。如果使用memcpy或memmove将值复制到没有声明类型的对象中,或者作为字符类型的数组复制,则对于该访问和不修改该值的后续访问,修改对象的有效类型是从中复制值的对象的有效类型,如果它有一个。对于所有其他对没有声明类型的对象的访问,对象的有效类型只是用于访问的左值的类型。87)分配的对象没有声明类型
1条答案
按热度按时间4xrmg8kj1#
是的,这两个函数都为具有 * 分配的存储持续时间 * 的对象返回内存。这在C standard的第6.2.4p1节关于对象的存储持续时间中首次提到:
对象具有决定其生存期的存储持续时间。有四种储存时间:static、thread、automatic 和 allocated。已分配的存储在7.22.3中描述。
在第7.22.3节中,它提到了数组和非数组对象:
通过连续调用 aligned_alloc、calloc、malloc 和 realloc 函数分配的存储的顺序和连续性未指定。如果分配成功,则返回的指针被适当地对齐,以便它可以被分配给指向具有基本对齐要求的任何类型的对象的指针,然后用于访问分配的空间中的此类对象或此类对象的数组(直到空间被显式地释放)。已分配对象的生存期从分配开始一直到释放结束。每个这样的分配将产生一个指向与任何其他对象不相交的对象的指针。返回的指针指向所分配空间的开始(最低字节地址)。如果无法分配空间,则返回空指针。如果请求的空间大小为零,则行为是实现定义的:要么返回空指针,要么行为就好像大小是某个非零值,只是返回的指针不应用于访问对象。
还应该注意的是,这些函数返回的内存在写入之前没有 * 有效类型 *,这实质上意味着你可以在这些内存中存储任何你想要的东西。这在第6.5p6节中详细说明:
对象的有效类型是该对象的声明类型(如果有的话),用于访问其存储值。87)如果一个值通过一个不是字符类型的左值被存储到一个没有声明类型的对象中,那么左值的类型就成为该对象的有效类型,用于该访问和不修改存储值的后续访问。如果使用memcpy或memmove将值复制到没有声明类型的对象中,或者作为字符类型的数组复制,则对于该访问和不修改该值的后续访问,修改对象的有效类型是从中复制值的对象的有效类型,如果它有一个。对于所有其他对没有声明类型的对象的访问,对象的有效类型只是用于访问的左值的类型。
87)分配的对象没有声明类型