【问题标题】:The initialization of the dynamically allocated memory in C [duplicate]C中动态分配内存的初始化[重复]
【发布时间】:2019-02-18 15:41:06
【问题描述】:

我仍然对 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 不是未初始化吗? 谁能给我解释一下?谢谢!

【问题讨论】:

标签: c malloc calloc


【解决方案1】:

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

如果您想对内存进行零初始化(这意味着所有指针都是NULL),那么请使用calloc,或者显式初始化数据。

另请注意,在 C 中你 should not cast the return of malloc (and siblings)

【讨论】:

  • 我应该转换 calloc() 或 realloc() 的返回吗?如果我应该,为什么??
  • @Liu 不,这就是我所说的“兄弟姐妹”。在 C 中,您不应该强制转换返回 void *any 函数的结果。
【解决方案2】:

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

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

【讨论】:

【解决方案3】:

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

引用C11,第 7.22.3.4/P2 章

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

【讨论】:

  • 我认为,Sourav 想说的是,您不能相信您的测试可以明确地告诉您内存是否已初始化。您正在查看的字节可能已经为零。
猜你喜欢
  • 2015-11-08
  • 2012-09-15
  • 1970-01-01
  • 1970-01-01
  • 2018-02-18
  • 1970-01-01
  • 2021-09-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多