如何在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_fields14非常不同,它不是常量,它是只读的。

即使使用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规则下不是一个在编译时有效的“常量表达式”,因此不能用作数组大小在最外面的“计划”范围内。