如何在C中初始化一个指向NULL的动态指针数组?
我是C的新手,我不明白为什么以下两个语句不会产生相同的结果:
char *fields[14] = {NULL}; const int num_fields = 14; char *fields[num_fields] = {NULL};
选项1有效,但选项2没有。 它说“可变大小的对象可能不会被初始化”并且它会发出警告“警告:数组初始化程序中的多余元素”。 我在OSX上使用gcc 4.2.1。
谢谢你分享你的想法!
第二个对象称为VLA(可变长度数组),由C99很好地定义。 为了达到你想要的效果,你可以使用:
for (i = 0; i < num_fields; i++) fields[i] = NULL;
问题的要点是const int num_fields
与14
非常不同,它不是常量,它是只读的。
即使使用const关键字定义num_fields,编译器也只将其解释为变量。 你可以通过定义以下宏来替代它:
#define num_fields 14
char * fields [num_fields] = {NULL};
尽管num_fields
具有const
限定符,但编译器仍将其视为变量。
因此,您试图声明一个可变大小的数组,并且初始化器( {NULL}
部分)不能与它们一起使用。
您的构造在C ++中工作,其中const int将被视为编译时常量(“常量表达式”),因此可用作编译时数组大小。
(这方面是B. Stroustrup的C ++设计目标之一,如果可能的话,不需要编译时宏)
但是在C中,你对“num_fields”的定义有效地声明了一个带有预设值的只读内存位置,因此在C规则下不是一个在编译时有效的“常量表达式”,因此不能用作数组大小在最外面的“计划”范围内。