【问题标题】:Initialising an array of pointers to structs in C在 C 中初始化指向结构的指针数组
【发布时间】:2011-05-02 22:45:04
【问题描述】:

我有一个指向结构的指针数组。我想将数组中的每个元素初始化为 NULL。我将使用这个数组来动态添加和删除条目,因此我希望能够针对 NULL 进行测试以查看该索引是否为空。

我试着这样做:

struct mystructure *cxs[MAXNOCXS];

int cx_init(void)
{
    int i = 0;
    for (i=0; i<MAXNOCXS; i++)
        cxs[i] == NULL;
    return 0;
}

但我的编译器告诉我:

error: statement with no effect

参考cxs[i] = NULL;这一行

C 中的指针数组是否自动初始化为 NULL?如果不是,我该怎么做?

【问题讨论】:

    标签: c pointers struct null initialization


    【解决方案1】:

    您正在使用== 运算符而不是= 运算符。实际上,不是将NULL 分配给cxs[i](如果您使用赋值运算符= 会这样做),而是将每个元素与NULL 进行比较并丢弃此类比较的结果,因此会出现警告你的编译器。

    请注意,您可以使用符号更简单地初始化您的数组

    struct mystructure * cxs[MAXNOCXS] = {};
    

    这个语法告诉编译器默认初始化1数组的所有元素(因为包含显式初始化器的大括号是空的),这意味着指针被初始化为@ 987654328@ 和算术类型为 0。

    如果您的数组具有“静态存储持续时间”(即它是一个全局变量或static 变量),您不需要做任何特别的事情,因为它已经默认初始化了。


    1. 如果它们是 static 变量(C99,§6.7.8 ¶10,¶21),它们将被初始化的值。

    编辑

    在阅读之后,似乎 C 标准与 C++ 标准不同,不支持空初始化器。不过,您始终可以这样做:

    struct mystructure * cxs[MAXNOCXS] = {NULL};
    

    这将使用NULL 初始化第一个元素,并让其他元素默认初始化(再次为NULL)。

    【讨论】:

    • 假设这些变量在全局范围内,即使它们不是static,它们也会被默认初始化。另外,我认为标准不允许空的初始化列表。
    • @Oli:关于static 是正确的,我来自静态存储持续时间 的标准,这是另一回事,现在我更正它。对于空的初始化列表,我使用 gcc 4.5 和-ansi -Wall -Wextra 即时检查,它没有抱怨,现在我将检查标准...
    • 感谢您的出色回答,我自己应该注意到错字了。还值得注意的是@Oli 的评论,即我的全局变量已经被初始化。
    • @Oli:显然你是对的,标准中的语法描述似乎不允许空的初始化列表,快速搜索似乎证实了这一事实。
    • 是的,语法定义似乎禁止它。
    【解决方案2】:

    您会注意到您的线路是cxs[i] == NULL;,而不是您想要的cxs[i] = NULL;

    此外,由于您的数组似乎已在全局范围内声明(因此具有静态存储持续时间),默认情况下它的所有元素都将初始化为零,因此指针已经都相等NULL。 (请注意,这绝对不是函数内的标准局部变量的情况)。

    【讨论】:

      【解决方案3】:

      您的代码中似乎有错字,并且不小心使用了比较运算符而不是赋值 - 这就是编译器告诉您的内容

      for (i=0; i<MAXNOCXS; i++)
              cxs[i] == NULL;
      

      应该是

      for (i=0; i<MAXNOCXS; i++)
              cxs[i] = NULL;
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-09-16
        • 1970-01-01
        • 2017-01-19
        相关资源
        最近更新 更多