我仍然与两个函数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
功能分配了大小按大小指定且值不确定的对象的空间。