非常简单的问题,我做了以下程序:
#include <stdlib.h>
int main(int argc, char ** argv)
{
void * ptr;
ptr = malloc(0);
free(ptr);
}
它不会在我的机器上发生段错误。它是stdlib malloc的可移植行为还是免费的,还是我在寻找麻烦?
编辑:看似不可移植的是malloc返回的值。问题是关于malloc(0)+自由组合,而不是ptr的值。
答案 0 :(得分:58)
行为是实现定义的,您将收到NULL指针或地址。但是,为接收到的指针调用应该不会导致问题,因为:
答案 1 :(得分:26)
允许返回NULL,并允许返回非NULL指针 你不能解除引用。两种方式都由标准(7.20.3)批准:
如果请求的空间大小为零,则行为为 implementation-defined:返回空指针,或者 行为就像大小是一些非零值,除了 返回的指针不得用于访问对象。
答案 2 :(得分:4)
不好意思,我应该阅读手册页:
malloc()分配大小字节并返回指向已分配内存的指针。内存未清除。如果size为0,则malloc()返回NULL或a 唯一指针值,以后可以成功传递给free()。
free()释放ptr指向的内存空间,该内存空间必须由之前调用malloc(),calloc()或realloc()返回。否则,或者如果 之前已经调用了free(ptr),发生了未定义的行为。如果ptr为NULL,则不执行任何操作。
至少对于gnu libc来说似乎是真的
答案 3 :(得分:3)
根据c标准
7.20.3 如果请求的空间大小为零,则行为是实现定义的:返回空指针,或者行为就像大小是非零值一样,除了返回的指针不应用于访问对象。
答案 4 :(得分:1)
答案 5 :(得分:0)
虽然它可能是合法的C / C ++,但它表明存在更大的问题。我通常称之为'指针邋。'。
参见“不要对malloc(0)或calloc(0)的结果做出假设”,https://www.securecoding.cert.org/confluence/display/seccode/VOID+MEMxx-A.+Do+not+make+assumptions+about+the+result+of+malloc%280%29+or+calloc%280%29。
答案 6 :(得分:-3)
根据我的经验,我已经看到malloc(0)返回一个可以释放的指针。 但是,这会在后面的malloc()语句中导致SIGSEGV。 这是非常随意的。
当我添加一个支票时,如果要分配的大小为零,不要调用malloc,我就摆脱了这个。
所以,我建议不要为大小0分配内存。
-Ashutosh