初始化C中指向结构的指针数组

初始化C中指向结构的指针数组,c,pointers,struct,null,initialization,C,Pointers,Struct,Null,Initialization,我有一个指向结构的指针数组。我想将数组中的每个元素初始化为NULL。我将使用这个数组动态地添加和删除条目,以便能够针对NULL进行测试,以查看该索引是否为空 我试着这样做: struct mystructure *cxs[MAXNOCXS]; int cx_init(void) { int i = 0; for (i=0; i<MAXNOCXS; i++) cxs[i] == NULL; return 0; } 参考线cxs[i]=NULL 指针

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

我试着这样做:

struct mystructure *cxs[MAXNOCXS];

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


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

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

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

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

您将注意到您的行是cxs[i]==NULL;,而不是cxs[i]=NULL;如你所愿

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

您使用的是==运算符,而不是=运算符。实际上,如果您使用赋值运算符=将每个元素与NULL进行比较,并丢弃这种比较的结果,那么编译器就会发出警告,而不是将NULL赋值给cxs[i]

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

struct mystructure * cxs[MAXNOCXS] = {};
此语法告诉编译器对数组的所有元素进行默认初始化1,因为包含显式初始值设定项的大括号为空,这意味着指针初始化为NULL,算术类型初始化为0

如果您的阵列具有静态存储持续时间,即它是全局或静态变量,则无需执行任何特殊操作,因为它已默认初始化

如果它们是静态变量C99,§6.7.8¨10,¨21,则初始化为的值。 编辑

在阅读了之后,看起来C标准不同于C++一个,不支持空的初始化器。尽管如此,您仍然可以:

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

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

假设这些变量在全局范围内,即使它们不是静态的,它们也是默认初始化的。另外,我认为该标准不允许出现空的初始值设定项列表。@Oli:关于静态,我来自一个说静态存储持续时间的标准,这是另一回事,现在我更正了它。对于空的初始值设定项列表,我用gcc4.5和-ansi-Wall-Wextra进行了动态检查,它没有抱怨,现在我要检查标准…感谢您的精彩回答,我应该自己注意到这个输入错误。还值得注意的是@Oli关于我的全局变量将被初始化的评论。@Oli:显然你是对的,标准中的语法描述似乎不允许空的初始化列表,快速搜索似乎证实了这一事实。是的,语法定义似乎禁止它。
struct mystructure * cxs[MAXNOCXS] = {NULL};