C

时间:2019-02-18 15:41:06

标签: c malloc calloc

我仍然对malloc()和calloc()这两个函数感到困惑
我们知道calloc()初始化它分配的内存,而malloc()没有。
但是当我尝试以下代码时,结果似乎出乎意料。

typedef struct{
    int *val;
}Node;
int main()
{
    Node *q=(Node*)malloc(sizeof(Node));
    if(q->val==NULL) printf("malloc initialized memory\n");
    Node *p=(Node*)calloc(1,sizeof(Node));
    if(p->val==NULL) printf("calloc initialized memory\n");
}

p和q的val的变量“ val”均为NULL。 q-> val是否未初始化? 谁能向我解释?谢谢!

3 个答案:

答案 0 :(得分:1)

malloc函数不会初始化其分配的内存。内容将不确定(可能看起来是“随机”或“垃圾”)。

如果要对内存进行零初始化(这意味着所有指针均为NULL),请使用calloc或显式初始化数据。

还要注意,在C中,您should not cast the return of malloc (and siblings)

答案 1 :(得分:0)

当变量未初始化时,它的形式是不确定。它可以是任何值,并且0与任何其他值一样随机。仅仅因为您读取0并不一定意味着变量已初始化。

您实际上是通过尝试读取q->val来调用undefined behavior,因为1)尚未初始化,并且2)从未使用过其地址。除非不确定的值是陷阱表示,否则如果先获取其地址,就不会有不确定的行为。

答案 2 :(得分:0)

通过malloc()返回的内存块包含不确定的值。尝试使用该值可能会导致未指定的结果,因为无法保证有关该值的任何事情。

引用C11,第7.22.3.4/P2章

  

malloc函数为尺寸由大小指定且值不确定的对象分配空间。