【问题标题】:Do I still need to set ptr to NULL if I use memset earlier?如果我之前使用 memset,我还需要将 ptr 设置为 NULL 吗?
【发布时间】:2020-04-13 07:01:56
【问题描述】:

例如:

struct sth {
    int  t;
    char *p;
    struct sth *next;
}

还有初始化代码:

struct sth *data = malloc(sizeof(*data));
memset(data, 0, sizeof(*data));
data->t = 0;        // A
data->p = NULL;     // B
data->next = NULL;  // C

既然用了memset,还需要写A, B, C吗?

这只是一个示例,我有一个包含很多指针的结构...

【问题讨论】:

  • 你是安全的——但请注意,仅仅因为你将每个字节设置为零,标准并不能保证指针NULL(尽管它在我测试过的任何编译器上都可以)与 -- 但从迂腐的角度来看,您需要检查)另一方面,要完全兼容,将指针初始化留给NULL 的成本很低。以上,您可以简单地使用calloc 进行分配来完成同样的事情。
  • 您可以通过使用struct sth *data = calloc(1, sizeof(*data));分配来省略memset()

标签: c memory memory-management initialization malloc


【解决方案1】:

不需要。您也可以使用calloc() 代替malloc(),它会将内存设置为零,而无需额外调用memset()may be faster

【讨论】:

    【解决方案2】:

    如果我之前使用memset(),是否还需要将ptr 设置为NULL

    如果您希望您的程序完全符合标准,那么可以,因为memset() 将每个字节设置为0,这与将NULL 设置为指针不同。 (假设ptr 等价于结构内部的p sth)。

    引用当前 C 标准 ISO:IEC 9899:2018 (C18),第 7.22.3.5/2 节 - calloc 函数:

    "空间初始化为所有位为零。302)"

    "302 - 请注意,此不必与浮点零或空指针常量的表示形式相同"


    "既然用了memset(),还需要写A、B、C吗?

    A. 是多余的,只要t 不是浮点类型的对象,因为它们可以具有浮点零值,可能不会将所有位都设置为0。如果 t 是 f.e. floatdouble A. 类型的类型将是有用且适合符合标准的。

    B.C. 是合适的,因为根据标准设置每个字节到 0 不一定也将指针设置为 NULL,如果您明确希望将它们分配给 NULL (虽然它应该在大多数系统上)。

    请注意,calloc() 可能更方便,性能也更快,因为它会分配内存并立即将其每一位初始化为0

    struct sth *data = calloc(sizeof(*data));
    

    但在这里,pnext 不需要是 NULL

    【讨论】:

      【解决方案3】:

      一个更简单的版本是:

      struct sth *data = malloc(sizeof(*data));
      *data = (struct sth){0};
      

      如果平台的结构成员全位为零,您的编译器可以将其优化为 calloc 调用。

      【讨论】:

        【解决方案4】:

        使用memset() 将结构设置为所有位为零有效地将所有整数成员设置为0。 C 标准指定其他成员将具有一个值,该值可能对应于手动将它们设置为 0 的效果,也可能不对应。但在所有当前架构上都是如此,而且未来任何新处理器似乎都不太可能背离这一惯例。所以在实践中你是安全的。

        还请注意,您应该使用calloc() 分配一个初始化为所有位为零的对象:

        struct sth *data = calloc(1, sizeof(*data));
        

        【讨论】:

          猜你喜欢
          • 2016-12-14
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2022-11-20
          • 1970-01-01
          • 2021-11-11
          • 2011-10-16
          相关资源
          最近更新 更多