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

在realloc()之前需要malloc()吗?,c,memory-management,malloc,alloc,C,Memory Management,Malloc,Alloc,因为我读过realloc,如果指向的大小为0,它将充当malloc,所以我使用它时没有malloc(),前提是指针是静态的、全局的,或者如果是自动的,则显式设置为NULL 然而,我注意到许多程序员试图设置它或将它设置为malloc(1)。需要吗?来自: 如果ptr是空指针,则realloc() 应等同于malloc(),用于 指定的大小 如果ptr与指针不匹配 由calloc()提前返回, malloc()或realloc()或 以前已由一个 调用free()或realloc(),则 行为是未定

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

然而,我注意到许多程序员试图设置它或将它设置为malloc(1)。需要吗?

来自:

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

如果ptr与指针不匹配 由calloc()提前返回, malloc()或realloc()或 以前已由一个 调用free()或realloc(),则 行为是未定义的


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

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

然而,使用
malloc
而不是
realloc
的特殊语义通常更清晰。这不是什么有效的问题,而是不会让阅读代码的人感到困惑


(编辑:删除了关于
realloc
充当
free
,因为它不是标准C。请参阅注释。)

请注意,尺寸为0的realloc的C99标准与POSIX标准略有不同。C99标准就是这样说的:如果请求的空间大小为零,则行为由实现定义:要么返回空指针,要么行为就好像大小是某个非零值。因此,当p不为空时,可以执行“p=malloc(n)”后跟“realloc(p,0)”吗?我真的不会这么做!Jeremy,这与“请求的”大小不相关吗?它与上一个指针的重新分配有什么关系?
realloc(p,0)
不幸地不等同于
free(p)
。普通C和POSIX都允许实现返回一个新指针,指向不允许写入的区域(其长度为“0”)以代替
NULL
。不幸的是,glibc就是这样一种实现,而且不缺少错误程序,这些程序期望glibc行为,并使用这些大量浪费的“大小0”分配(每个分配至少占用16个字节)进行自己的簿记。@R.,有趣的是,你是对的。我只检查了Linux手册页中的
realloc
,没有检查C标准。该标准并不意味着
realloc
能够释放内存。我将相应地编辑我的答案。