使用(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()的指针。

但无论如何,不​​允许取消引用该指针。 它将导致超出范围的内存访问并导致未定义的行为 。

那说,有两件重要的事情要提,

  1. 请参阅为什么不在 Cmalloc()和family的返回值。

  2. 请在使用返回的指针之前检查malloc()的返回值。

那么,回答你的问题,

使用(char *)malloc(0)和NULL初始化字符串之间的区别

在这种情况下不要使用malloc(0) ,因为对指针的NULL检查可能会失败,给出了对指针有效分配内存的错误印象。 始终使用NULL进行初始化。

上面的代码调用了未定义的行为。 您分配的内存不足,并且您正在访问无效的地址。

根据规范, malloc(0)将返回“空指针或可以成功传递给free()的唯一指针”。

malloc定义:

分配大小字节的内存块,返回指向块开头的指针。

新分配的内存块的内容未初始化,保留不确定的值。

如果size为零,则返回值取决于特定的库实现(它可能是也可能不是空指针),但返回的指针不应被解除引用。

从这里采取并发现这个相关的问题 。