realloc()之前需要使用malloc()吗?

33
自从我读到realloc指针指向大小为0会像malloc一样,我就在使用静态、全局或明确设置为NULL(自动)的指针中使用它而不使用malloc()。
然而,我注意到很多程序员尝试将其设置为malloc(1)或设置它。这是必需的吗?
2个回答

36

根据Open Group的规范

如果ptr是一个null指针,realloc()将等同于为指定大小分配内存的malloc()。

如果ptr不匹配之前由calloc()、malloc()或realloc()返回的指针,或者该空间之前已通过free()或realloc()释放,则行为是未定义的。


14

malloc 不是必需的,你可以只使用 realloc

malloc(n) 等同于 realloc(NULL, n)

然而,通常更清晰的做法是使用 malloc 而不是 realloc 的特殊语义。这不是关于代码是否可行,而是为了不让阅读代码的人感到困惑。

(编辑:删除了关于 realloc 具有 free 功能的提及,因为它不是标准 C。请参见评论。)


3
请注意,C99标准中的realloc函数在请求大小为0时与POSIX标准略有不同。C99标准只是这样说:“如果请求空间大小为零,则行为是实现定义的:要么返回一个空指针,要么行为就像请求了一些非零值大小一样。” - JeremyP
当p不为NULL时,可以执行“p = malloc(n)”后跟“realloc(p, 0)”吗?我真的不会这样做!对格式化造成的困扰表示抱歉。 - dubnde
Jeremy,这与“请求”的大小有关吗?这与重新分配先前指针有什么关系? - j riv
2
realloc(p,0) 不幸地不等同于 free(p)。纯 C 和 POSIX 允许实现返回一个新指针到一个你不能写入的区域(它有“长度 0”)来代替 NULL。遗憾的是 glibc 就是这样的实现之一,而且有很多有缺陷的程序期望 glibc 的行为并使用这些极其浪费的“大小为 0”的分配(每个至少需要 16 个字节)进行自己的簿记。 - R.. GitHub STOP HELPING ICE
@R.,有趣,你是对的。我只检查了Linux manpage中的realloc,而没有检查C标准。标准并不意味着realloc能够释放内存。我会相应地编辑我的答案。 - user25148

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