我有一个指向结构的指针数组。我想将数组中的每个元素初始化为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?如果不是我怎么能这样做?
答案 0 :(得分:5)
您使用的是==
运算符,而不是=
运算符。实际上,您不是将NULL
分配给cxs[i]
(这是您使用赋值运算符=
时会执行的操作),而是将每个元素与NULL
进行比较并丢弃这种比较的结果,因此是编译器的警告。
请注意,您可以使用符号
更简单地初始化数组struct mystructure * cxs[MAXNOCXS] = {};
这个语法告诉编译器默认初始化 1 数组的所有元素(因为大括号,包含显式初始化器,是空的),这意味着指针初始化为{ {1}}和算术类型为0。
如果您的数组具有“静态存储持续时间”(即它是全局或NULL
变量),则您不需要执行任何特殊操作,因为它已经默认初始化。
static
变量(C99,§6.7.8¶10,¶21),它们将初始化为它们的值。修改强> 的
在阅读之后,似乎C标准与C ++标准不同,它不支持空初始化器。不过,你可以随时做:
static
将使用struct mystructure * cxs[MAXNOCXS] = {NULL};
初始化第一个元素,并让其他元素默认初始化(再次转换为NULL
)。
答案 1 :(得分:2)
您会注意到您的行是cxs[i] == NULL;
,而不是您想要的cxs[i] = NULL;
。
此外,由于您的数组似乎已在全局范围内声明(因此具有静态存储持续时间),因此默认情况下它的所有元素都将初始化为零,因此指针已经全部等于NULL
。 (请注意,这绝对是不函数内部标准局部变量的情况。)
答案 2 :(得分:1)
您的代码中似乎有一个拼写错误并且意外地使用了比较运算符而不是赋值 - 这就是编译器告诉您的内容
for (i=0; i<MAXNOCXS; i++)
cxs[i] == NULL;
应该是
for (i=0; i<MAXNOCXS; i++)
cxs[i] = NULL;