redimensionando dinámicamente una matriz de cadenas

Necesito una serie de cadenas en las que no se conoce la longitud de la matriz en el momento de la comstackción. Lo que he hecho es:

char **words; words = malloc(capacity * sizeof(char *)); char nextword[MAX_LEN + 1]; while (true) { if (num_entries == capacity) { capacity += 5; realloc(words, (sizeof(char *) * capacity)); } printf("\nEnter a word: "); fgets (nextword, MAX_LEN, stdin); remove_newline(nextword); if (strlen(nextword) == 0) break; words[num_entries] = malloc(strlen(nextword + 1)); if (words[num_entries] == NULL) { printf("\nout of space\n"); break; } strcpy(words[num_entries], nextword); num_entries++; 

Esto parece funcionar para expandir el tamaño una vez, excepto que el primer elemento después de la expansión se convirtió en NULL por alguna razón. La segunda vez que se ejecuta realloc me sale un error:

"invalid next size" .

Tu código está casi ahí, solo necesitas algunas modificaciones. Una cosa importante para recordar es que realloc no modifica el valor que le pasas, y no es necesario devolver el puntero a la misma porción de memoria que le pasaste. Aquí hay un ejemplo práctico del uso de realloc . Es bastante sencillo, por lo que debería poder corregir su código simplemente siguiendo el ejemplo.

 char **more_words = realloc(words, capacity); if (more_words) { words = more_words; } else { // Do something about realloc failure } 

realloc se garantiza que realloc le devuelva la misma porción de memoria, ya que el bloque que originalmente fue asignado desde el montón puede no tener suficiente espacio para acomodar su nuevo tamaño solicitado. En este caso, recuperará un nuevo bloque de memoria, con sus datos antiguos copiados.

Debe capturar el valor devuelto en cada bucle y usarlo para verificar los datos que espera, y también verificar que sea 0 (si no se puede realizar la realloc ).

 words = realloc(words,..) 

es un antipattern: evite esto ya que su memoria anterior puede perderse si el realloc falla.