在realloc()之前需要malloc()吗?

j r*_*riv 26 c malloc memory-management alloc

因为我读过realloc将作为malloc,如果指向的大小是0,我使用它没有malloc(),前提是指针是静态的,全局的,或者如果是自动的话显式设置为NULL.

但是,我注意到很多程序员试图设置它或将其设置为malloc(1).需要它吗?

Sim*_*one 26

开放组的规格:

如果ptr是空指针,则realloc()应等于指定大小的malloc().

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


小智 11

malloc不是必需的,您只能使用realloc.

malloc(n)相当于realloc(NULL, n).

但是,使用它malloc代替特殊语义通常更清晰realloc.这不是什么有效的问题,而是混淆阅读代码的人.

(编辑:删除提及realloc作为free,因为它不是标准C.见评论.)

  • 请注意,大小为0的realloc的C99标准与POSIX标准略有不同.C99标准就是这样说的:*如果请求的空间大小为零,则行为是实现定义的:返回空指针,或者行为就像大小是非零值*一样. (3认同)
  • 不幸的是,`realloc(p,0)`不等同于`free(p)`。普通C和POSIX都允许实现,这些实现将新的指针返回到不允许写入的区域(长度为“ 0”),以代替NULL。遗憾的是,glibc就是这样的一种实现,而且不乏越野车程序期待glibc的行为,并使用这些浪费大量的“ size 0”分配(每个分配至少占用16个字节)来进行自己的簿记。 (2认同)