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

时间:2015-08-06 12:14:44

标签: c string

为什么在这种情况下分配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;
}

3 个答案:

答案 0 :(得分:10)

首先让我根据malloc()

man page说明
  

malloc()函数分配大小字节并返回指向已分配内存的指针。内存未初始化。 如果尺寸为0,则malloc()会返回NULL或唯一指针值,以后可以成功传递给free()

malloc(0)之类的调用本身就是有效,但是,我们需要检查返回指针的有效性。它可以

  • 返回NULL
  • 返回一个可以传递给free()
  • 的指针

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

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

  1. malloc() Cmalloc()中的家人返回see why not to cast

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

  3. 所以,回答你的问题,

      

    使用malloc(0)初始化字符串与NULL

    之间的区别

    在这种情况下不要使用NULL,因为对指针的NULL检查可能失败,给出了有效内存分配的错误印象指针。始终使用<document> <entity name="item" query="select * from items" > <field column="id" name="id" /> <field column="name" name="name" /> <entity name="params" query="select param_name, param_value from items where item_id ='${item.id}'"> <field name="param_value" column="param_value" /> </entity> </entity> </document> 进行初始化。

答案 1 :(得分:4)

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

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

答案 2 :(得分:1)

malloc定义:

  

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

     

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

     

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

取自here并找到this related question