-1

可能重复:
malloc(0) 有什么意义?

为什么 malloc(0) 实际上会返回一个有效的写入指针?

char *str = NULL;

str = (char*)malloc(0); // allocate 0 bytes ?

printf("Pointer of str: %p\n", str);

strcpy(str, "A very long string ...................");

printf("Value of str: %s", str);

free(str); // Causes crash if str is too long

输出:

Pointer of str: 0xa9d010
Aborted
Value of str: A very long string ...................

什么时候str更短,那么它就可以正常工作。

顺便说一句:为了编译,我使用带有“-D_FORTIY_SOURCE=0 -fno-stack-protector”的 GCC

*** glibc detected *** ..: free(): invalid next size (fast): 0x0000000000a9d010 ***
4

3 回答 3

4

取消引用由 .返回的指针是未定义的行为malloc(0)

来自 C 标准:

(C99, 7.20.3p1) “如果请求的空间大小为零,则行为由实现定义:要么返回空指针,要么行为就像大小是某个非零值一样,除了返回的指针应不能用于访问对象。”

于 2013-01-23T18:53:54.773 回答
2

为什么malloc(0)实际上返回一个有效的写入指针?

它没有返回有效的写入指针。它返回一个不使用它的有效指针。或者它也可能返回NULL,因为 C 标准指定这种情况是实现定义的。

于 2013-01-23T18:56:32.417 回答
1

malloc() 应该返回一个 void* 指针。它忠实地做到了这一点。但是当你取消引用它时会导致 UB。

于 2013-01-23T18:56:23.167 回答