【发布时间】:2010-12-16 09:40:38
【问题描述】:
由于我已经阅读 realloc 将在指向的大小为 0 时充当 malloc,因此我在没有 malloc() 的情况下使用它,前提是指针是静态的、全局的,或者如果是自动的,则显式设置为 NULL。
但是,我注意到很多程序员尝试设置它或将其设置为 malloc(1)。需要吗?
【问题讨论】:
标签: c memory-management malloc alloc
由于我已经阅读 realloc 将在指向的大小为 0 时充当 malloc,因此我在没有 malloc() 的情况下使用它,前提是指针是静态的、全局的,或者如果是自动的,则显式设置为 NULL。
但是,我注意到很多程序员尝试设置它或将其设置为 malloc(1)。需要吗?
【问题讨论】:
标签: c memory-management malloc alloc
来自Open Groups' specifications:
如果 ptr 是空指针,realloc() 应等同于 malloc() 指定的大小。
如果 ptr 不匹配指针 calloc() 之前返回的, malloc() 或 realloc() 或如果空间 之前已被解除分配 调用 free() 或 realloc(), 行为未定义。
【讨论】:
malloc 不是必需的,您可以只使用realloc。
malloc(n) 等价于realloc(NULL, n)。
但是,使用malloc 而不是realloc 的特殊语义通常更清晰。这不是什么有效的问题,而是不要让阅读代码的人感到困惑。
(编辑:删除提及 realloc 充当 free,因为它不是标准 C。请参阅 cmets。)
【讨论】:
realloc(p,0) 不幸的是不等同于free(p)。普通 C 和 POSIX 都允许实现返回一个新指针,该指针指向您不允许写入的区域(它具有“长度 0”)来代替 NULL。可悲的是 glibc 就是这样一种实现,并且不乏错误的程序,它们期望 glibc 行为并使用这些大量浪费的“大小 0”分配(每个占用至少 16 个字节)进行自己的记账。
realloc 的 Linux 联机帮助页,而不是 C 标准。该标准并未暗示realloc 能够释放内存。我会相应地编辑我的答案。