¿Cómo crear una matriz de puntero de caracteres en C?

Tengo que crear una serie de punteros de caracteres cada uno de ellos de tamaño 10000000 utilizando la mejor forma optimizada de hacerlo en C.

Creo que esta es la forma óptima porque solo hay una asignación dinámica, lo que reduce la sobrecarga de la fragmentación del montón y el tiempo que se tarda en asignar. Puede utilizar la función de utilidad STRING_INDEX para acceder a la cadena n.

Además, usar calloc () en lugar de malloc () pone a cero el búfer para asegurar que todas las cadenas terminen en NUL.

 #define STRING_SIZE 10000000 #define NUM_STRINGS 10 #define STRING_INDEX(array, string_idx) ((array) + (string_idx) * STRING_SIZE) int main(int argc, char **argv) { char *array_of_strings = calloc(NUM_STRINGS, STRING_SIZE); // Access 8th character of 7th string char c = STRING_INDEX(array_of_strings, 7)[8]; // Use array // Free array when done free(array_of_strings); return 0; } 

Creo que esto servirá (no he comprobado si hay nulos):

 int i; int num_arrays; char **huge_char_array; num_arrays = 10; //number of arrays you want. huge_char_array = (char **)malloc(sizeof(char *) * num_arrays); for(i = 0; i < num_arrays; i++) { huge_char_array[i] = (char *)malloc(sizeof(char) * 10000000); } 

Estuve asignando 50K con cada solicitud que procesé, lo que resultó en una fragmentación de la memoria. Así que cambié para asignar 50k * 100 = 5MB y reutilizar el grupo cuando necesito asignar uno más. Si las solicitudes aumentan más allá de la capacidad de mi grupo, duplico el tamaño del grupo para evitar fragmentaciones de memoria. En base a esto, recomendaría asignar una gran cantidad de memoria, tal vez en su caso 10 * 10000000 para reutilizarla. Lo siento, pero no puedo compartir el código que maneja el grupo aquí. También use malloc y gratis y no use nuevo y elimine.

malloc no lo hará por excepción, simplemente devolverá nulo si no hay memoria disponible.

Si insiste en usar malloc para cada elemento individualmente, puede crear un montón con el tamaño máximo para evitar fragmentaciones y, en ese caso, tendrá que definir el tamaño del montón.

para obtener más detalles sobre cómo crear un montón y usarlo u otros métodos de asignación disponibles para los usuarios de Windows. http://msdn.microsoft.com/en-us/library/windows/desktop/aa366533(v=vs.85).aspx

 char *arr[SOME_SIZE]; for(int i = 0; i < SOME_SIZE; ++i) { arr[i] = malloc(10000000); if(!arr[i]) // allocation failed, do something } 

Solo tenga en cuenta que está asignando ~ 9.5MB para cada elemento de la matriz (es decir, SOME_SIZE * 10000000 bytes totales)