Array dynamic utilizando ANSI C

Tengo una matriz de char

char *data[]= {"11", "22", "33", "44", "55"}; 

¿Cómo puedo agregar algunos elementos adicionales al final? data[]="66";

Me gustaría una matriz dinámica en C.

Gracias

Las matrices creadas utilizando la syntax [] no son dinámicas, la longitud se establece en tiempo de comstackción y no puede cambiar.

ACTUALIZACIÓN : En realidad, C99 agrega los llamados “arreglos de longitud variable”, que pueden obtener su longitud en tiempo de ejecución. Sin embargo, después de que se hayan inicializado, no se pueden reducir ni expandir, por lo que aún se aplica lo siguiente.

Sin embargo, una matriz se expresa de forma trivial cuando tiene punteros: una matriz se puede representar como un puntero al primer elemento y una longitud.

Por lo tanto, puede crear una nueva matriz mediante la asignación dinámica de memoria usando malloc() :

 size_t array_length = 3; int *array = malloc(array_length * sizeof *array); if(array != NULL) { array[0] = 11; array[1] = 22; array[2] = 33; } 

No puede usar la {} lista de elementos aquí, que solo se puede usar cuando se inicializan matrices declaradas usando la syntax [] .

Para hacer crecer la matriz, puede usar la función realloc() para volver a asignar la memoria y copiar los valores antiguos sobre:

 size_t new_length = array_length + 1; int *bigger_array = realloc(array, new_length * sizeof *bigger_array); if(bigger_array != NULL) { bigger_array[new_length - 1] = 44; /* We have successfully grown the allocation, remember the new address. */ array = bigger_array; array_length = new_length; } 

Tenga en cuenta que cada vez que llama a malloc() (o realloc() ), puede devolver NULL si no se pudo asignar el bloque solicitado. Es por eso que las declaraciones if son necesarias. Reduzco un poco el tamaño inicial de su ejemplo para reducir el número de líneas de asignación necesarias, para hacer que el ejemplo sea más corto.

Para hacer que el código de matriz dinámica típico, más eficiente sea el anterior, se utilizan dos valores de longitud: uno para la matriz real (cuántos valores hay en la matriz en este momento) y otro para la memoria (cuántos valores tenemos espacio para almacenar). Al hacer que este último valor crezca en trozos, el número total de asignaciones de memoria se puede reducir un poco, por supuesto, a costa de algo de memoria.

vc_vector

 vc_vector* vector = vc_vector_create(0, sizeof(const char *), NULL); vc_vector_push_back(vector, "11"); vc_vector_push_back(vector, "22"); vc_vector_push_back(vector, "33"); for (int i = 0; i < vc_vector_count(vector); ++i) { printf("%s ", (const char*)vc_vector_at(vector, i)); } // output: 11 22 33 vc_vector_release(vector);