零大小的malloc

很简单的问题,我做了以下程序:

#include <stdlib.h> int main(int argc, char ** argv) { void * ptr; ptr = malloc(0); free(ptr); } 

而且它不会在我的机器上发生段错误。 这是一个stdlib malloc和免费的便携式行为,还是我寻找麻烦?

编辑:似乎不可移植的是由malloc返回的值。 问题是关于malloc(0)+自由组合,而不是ptr的值。

该行为是定义的实现,您将收到一个NULL指针或地址。 免费调用收到的指针应该不会引起问题,因为:

  • 免费(空)是好的,没有任何操作完成
  • 免费(地址)是好的,如果地址是从malloc(或其他像calloc等)

它允许返回NULL,并允许返回一个不能解除引用的非NULL指针。 这两种方式都是由标准(7.20.3)制定的:

如果请求空间的大小为零,则行为是实现定义的:或者返回一个空指针,或者行为就像大小是非零值一样,除了返回的指针不能用于访问一个对象。

对不起,我应该看看手册页:

malloc()分配大小字节并返回指向分配内存的指针。 内存不被清除。 如果size为0,则malloc()返回NULL,或返回一个唯一的指针值,稍后可以成功传递给free()。

free()释放由ptr指向的内存空间,该内存空间必须是以前调用malloc(),calloc()或realloc()所返回的内存空间。 否则,或者如果之前已经调用了空闲(ptr),则会发生未定义的行为。 如果ptr为NULL,则不执行任何操作。

至less对于gnu libc来说似乎是这样

考虑到libt和Pax的意见,

调用malloc(0)的行为是依赖于实现的,换句话说是不可移植的和未定义的。

链接到CFaq问题的更多细节。

根据c标准

7.20.3如果所请求空间的大小为零,则行为是实现定义的:或者返回空指针,或者行为就好像大小是非零值,除了返回的指针不能用于访问一个东西。

虽然它可能是合法的C / C ++,但它意味着更大的问题。 我通常把它称为'指针slopiness'。

请参阅“不要对malloc(0)或calloc(0)的结果做出假设”, https://www.securecoding.cert.org/confluence/display/seccode/VOID+MEMxx-A.+Do+not+ + + + + + + + calloc%280%29 + + + + + + +

根据我的经验,我已经看到malloc(0)返回一个可以释放的指针。 但是,这会在以后的malloc()语句中导致SIGSEGV。 这是非常随机的。

当我添加一个支票,为了不调用malloc如果大小分配为零,我摆脱了这一点。

所以,我会build议不要为0分配内存。

-Ashutosh