自从我读到realloc指针指向大小为0会像malloc一样,我就在使用静态、全局或明确设置为NULL(自动)的指针中使用它而不使用malloc()。
然而,我注意到很多程序员尝试将其设置为malloc(1)或设置它。这是必需的吗?
然而,我注意到很多程序员尝试将其设置为malloc(1)或设置它。这是必需的吗?
如果ptr是一个null指针,realloc()将等同于为指定大小分配内存的malloc()。
如果ptr不匹配之前由calloc()、malloc()或realloc()返回的指针,或者该空间之前已通过free()或realloc()释放,则行为是未定义的。
malloc
不是必需的,你可以只使用 realloc
。
malloc(n)
等同于 realloc(NULL, n)
。
然而,通常更清晰的做法是使用 malloc
而不是 realloc
的特殊语义。这不是关于代码是否可行,而是为了不让阅读代码的人感到困惑。
(编辑:删除了关于 realloc
具有 free
功能的提及,因为它不是标准 C。请参见评论。)
realloc(p,0)
不幸地不等同于free(p)
。纯 C 和 POSIX 允许实现返回一个新指针到一个你不能写入的区域(它有“长度 0”)来代替NULL
。遗憾的是 glibc 就是这样的实现之一,而且有很多有缺陷的程序期望 glibc 的行为并使用这些极其浪费的“大小为 0”的分配(每个至少需要 16 个字节)进行自己的簿记。 - R.. GitHub STOP HELPING ICErealloc
,而没有检查C标准。标准并不意味着realloc
能够释放内存。我会相应地编辑我的答案。 - user25148