【问题标题】:Is this pointer initialization necessary?这个指针初始化是必要的吗?
【发布时间】:2010-05-14 20:21:10
【问题描述】:

假设我有以下内容:

 CHARLINK * _init_link(CHARLINK **link)
 {
    short i;
    (*link)->cl = (CHARLINK **) calloc(NUM_CHARS, sizeof(CHARLINK *));
    for (i = 0; i < NUM_CHARS; i++)
        (*link)->cl[i] = NULL;
    return (*link);
}

将每个元素初始化为 NULL 的循环是必要的,还是它们会自动从 calloc 中为 NULL?

【问题讨论】:

    标签: c initialization malloc


    【解决方案1】:

    是的,在循环中赋值为 NULL 是必要的。 calloc 将所有位初始化为 0。但空指针可能不会这样表示。它取决于实现。因此,分配是必要的。

    【讨论】:

      【解决方案2】:

      这在一定程度上取决于您的系统,但在绝大多数情况下都可以。 calloc() 返回一个用零填充的缓冲区。但是,您机器上的空指针可能不是位模式 0。在空指针非零的机器上,您可能会遇到麻烦。

      【讨论】:

      • 依赖通常有效但不能保证有效的行为是个坏主意。即使您从未遇到过它,离开循环并将calloc() 更改为malloc() 会不会更容易,所以没有人会想取出循环并破坏其中之一的代码异国情调的平台?
      【解决方案3】:

      不,calloc 将其缓冲区初始化为 0。

      【讨论】:

      • 具体来说,它初始化为“所有位 0”,这可能不是 NULL(或 0 代表 float 值,就此而言)。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-10
      • 2016-11-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多