在C中动态分配的内存的初始化



我仍然与两个函数malloc()和calloc()
众所周知,calloc()初始化其分配的内存,而malloc()则不。

但是当我尝试以下代码时,结果似乎出乎意料。

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

P和Q的Val的变量" Val"都是无效的。Q-> val不是非专业化的吗?有人可以向我解释吗?谢谢!

malloc函数不是初始化其分配的内存。内容将为不确定(并且看起来"随机"或"垃圾")。

如果要零启动内存(这意味着所有指针均为NULL),则使用calloc或明确初始化数据。

还要注意,在C中,您不应施放malloc(和兄弟姐妹)的返回。

当变量非初始化时,正式表示其值为不确定。它可以是任何值,而0与任何其他值一样随机。仅仅因为您阅读0并不一定意味着变量是初始化的。

您实际上是通过尝试读取q->val来调用未定义的行为,因为1)它不是初始化的,而2)从未采用其地址。如果首先采用其地址,除非不确定的值是陷阱表示,否则您将不会有不确定的行为。

通过malloc()返回的内存块包含不确定的值。尝试使用该值可能会产生未指定的结果,因为关于该值的任何内容都无法guranteed。

引用C11,第7.22.3.4/p2

malloc功能分配了大小按大小指定且值不确定的对象的空间。

相关内容

  • 没有找到相关文章

最新更新