为什么在这种情况下分配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;
}
答案 0 :(得分:10)
首先让我根据malloc()
malloc()
函数分配大小字节并返回指向已分配内存的指针。内存未初始化。 如果尺寸为0,则malloc()
会返回NULL
或唯一指针值,以后可以成功传递给free()
。
malloc(0)
之类的调用本身就是有效,但是,我们需要检查返回指针的有效性。它可以
NULL
free()
。但无论如何,不允许取消引用该指针。它将导致超出范围的内存访问并导致undefined behaviour。
那说,有两件重要的事情要提,
请malloc()
C
和malloc()
中的家人返回see why not to cast。
请在使用返回的指针之前检查(char *)malloc(0)
的返回值。
所以,回答你的问题,
使用
之间的区别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为零,则返回值取决于特定库 实现(它可能是也可能不是空指针),但返回 指针不得解除引用。