使用(char *)malloc(0)和NULL初始化字符串之间的区别
为什么在这种情况下分配0大小的char
块? 但是如果我写char *string = NULL;
它不会起作用。
我正在使用Visual Studio。
int main() { char *string = (char *)malloc(0); string[0] = 'a'; string[1] = 'b'; string[2] = 'c'; string[3] = 'd'; string[4] = '\0'; printf("%s\n",string); return 0; }
首先让我说一下,按照malloc()
的手册页
malloc()
函数分配大小字节并返回指向已分配内存的指针。 内存未初始化。 如果size为0,则malloc()
返回NULL
或一个以后可以成功传递给free()
的唯一指针值。
像malloc(0)
这样的调用本身是有效的 ,但是,我们需要检查返回指针的有效性。 它可以
- 返回
NULL
- 返回一个可以传递给
free()
的指针。
但无论如何,不允许取消引用该指针。 它将导致超出范围的内存访问并导致未定义的行为 。
那说,有两件重要的事情要提,
-
请参阅为什么不在
C
中malloc()
和family的返回值。 -
请在使用返回的指针之前检查
malloc()
的返回值。
那么,回答你的问题,
使用
(char *)malloc(0)
和NULL初始化字符串之间的区别
在这种情况下不要使用malloc(0)
,因为对指针的NULL检查可能会失败,给出了对指针有效分配内存的错误印象。 始终使用NULL
进行初始化。
上面的代码调用了未定义的行为。 您分配的内存不足,并且您正在访问无效的地址。
根据规范, malloc(0)将返回“空指针或可以成功传递给free()的唯一指针”。
malloc
定义:
分配大小字节的内存块,返回指向块开头的指针。
新分配的内存块的内容未初始化,保留不确定的值。
如果size为零,则返回值取决于特定的库实现(它可能是也可能不是空指针),但返回的指针不应被解除引用。
从这里采取并发现这个相关的问题 。