¿Cómo asigno dinámicamente una matriz de cadenas en C?

Si tengo el número de elementos en una var llamada “totalstrings” y una var llamada “tamaño de cadena” que es el tamaño de cadena de cada elemento, ¿cómo asigno dinámicamente una matriz llamada “matriz”?

Esta es una matriz de cadenas en C, no en C ++.

¡Gracias!

NOTA: Mis ejemplos no comprueban las devoluciones NULL de malloc () … aunque debería hacerlo; se bloqueará si intenta utilizar un puntero NULL.

Primero tienes que crear una matriz de punteros de caracteres, uno para cada cadena (caracteres *):

char **array = malloc(totalstrings * sizeof(char *));

A continuación, debe asignar espacio para cada cadena:

 int i; for (i = 0; i < totalstrings; ++i) { array[i] = (char *)malloc(stringsize+1); } 

Cuando haya terminado de usar la matriz, debe recordar free() cada uno de los punteros que ha asignado. Es decir, recorre la matriz llamando a free() en cada uno de sus elementos, y finalmente también a free(array)

El idioma común para asignar una matriz N por M de cualquier tipo T es

 T **a = malloc(N * sizeof *a); if (a) for (i = 0; i < N; i++) a[i] = malloc(M * sizeof *a[i]); 

A partir del estándar de 1989, no necesita emitir el resultado de malloc , y de hecho, hacerlo se considera una mala práctica (puede suprimir un diagnóstico útil si olvida incluir stdlib.h o de lo contrario no tiene un prototipo). Para malloc en scope). Las versiones anteriores de C tenían malloc return char * , por lo que el reparto era necesario, pero las probabilidades de que tenga que trabajar con un comstackdor anterior a 1989 son bastante remotas en este momento. C ++ requiere la conversión, pero si está escribiendo C ++, debería usar el new operador.

En segundo lugar, tenga en cuenta que estoy aplicando el operador sizeof al objeto que se está asignando; el tipo de expresión *a es T * , y el tipo de *a[i] es T (donde, en su caso, T == char ). De esta manera, no tiene que preocuparse por mantener la expresión sizeof sincronizada con el tipo de objeto que se asigna. IOW, si decide utilizar wchar lugar de char , solo necesita hacer ese cambio en un lugar.

 char** stringList = (char**)malloc(totalStrings * sizeof(char*)); for( i=0; i 

Bueno, primero es posible que desee asignar espacio para “array”, que sería un array de char * que es “totalstrings”.

¿Cuáles serían entonces los índices de inicio y final en “array”? Sabes que el primero es 0; cual es el ultimo

Luego, para cada entrada en “array”, podrías (si quisieras) asignar un área de memoria que sea “stringsize + 1” (¿por qué +1, ora que me digas?) De largo, poniendo la dirección de inicio de esa área – esa cadena – en el miembro correcto de “matriz”.

Eso sería un buen comienzo, imo.