¿Cómo inicializar una matriz dinámica de punteros a NULL en C?

Soy bastante nuevo en C y no entiendo por qué las siguientes dos afirmaciones no crean el mismo resultado:

char *fields[14] = {NULL}; const int num_fields = 14; char *fields[num_fields] = {NULL}; 

La opción 1 funciona, pero la opción 2 no. Dice que “el objeto de tamaño variable no se puede inicializar” y muestra una advertencia “advertencia: exceso de elementos en el inicializador de matriz”. Yo uso gcc 4.2.1 en OSX.

¡Gracias por compartir tus pensamientos!

El segundo objeto se llama VLA (Variable Length Array), bien definido por C99. Para lograr lo que quieres puedes usar esto:

 for (i = 0; i < num_fields; i++) fields[i] = NULL; 

El problema principal es que const int num_fields es muy diferente de 14 , no es una constante, es de solo lectura.

Incluso si define num_fields con la palabra clave const, el comstackdor lo interpreta solo como variable. Puedes tener una alternativa para esto definiendo la siguiente macro:

#define num_fields 14

char * fields [num_fields] = {NULL};

Aunque num_fields tiene un calificador const , el comstackdor todavía lo considera una variable.

Por lo tanto, está intentando declarar una matriz de tamaño variable y los inicializadores (la parte {NULL} ) no se pueden usar junto con ellos.

Su construcción funciona en C ++, donde una constante se tratará como una constante de tiempo de comstackción (“expresión constante”) y, por lo tanto, estará disponible para su uso como un tamaño de matriz de tiempo de comstackción.

(Este aspecto fue uno de los objectives de diseño de B. Stroustrup para C ++, para eliminar la necesidad de macros en tiempo de comstackción si es posible)

Sin embargo, en C, su definición de “num_fields” declara efectivamente una ubicación de memoria de solo lectura con su valor preestablecido, y por lo tanto no está bajo las reglas de C una “expresión constante” válida en el momento de la comstackción, y por lo tanto no puede usarse como un tamaño de matriz en el ámbito externo ‘progtwig’.