Estoy tratando de leer un archivo de texto con un tamaño desconocido en una matriz. Lo hago leyendo un carácter a la vez en la matriz y reasignando memoria si se llega al final de la matriz.
A partir del aumento del tamaño de la matriz de 16 a 32, el método realloc copia solo los primeros 4 caracteres.
#include <stdio.h> #include <stdlib.h> #include <string.h> int main() { int *text_arr = malloc(1*sizeof(int)); text_arr[0] = '\0'; int text_len=1; int i=0; FILE *fp; fp = fopen("1.txt", "r"); while ((text_arr[i] = fgetc(fp)) != EOF) { /* increment i for next loop */ i++; /* extend the array if needed */ if (i >= text_len) { /* debug prints */ printf("Text: "); for (int n=0; n<i; n++) printf("%c,", text_arr[n]); printf("\n\n"); /* double array size */ text_len *= 2; text_arr = (int*)realloc(text_arr, text_len); } } text_arr[i] = '\0'; fclose(fp); return 0; }¿Cual podría ser el problema?
Está trabajando con objetos de tamaño sizeof (int) , debe asegurarse de multiplicar la cantidad solicitada de bytes por este tamaño cuando reasigna.
realloc(text_arr, sizeof (int) * text_len);realloc toma el tamaño en bytes como argumento . Sin embargo, está pasando el tamaño en elementos , que será menor por un factor del tamaño de int (generalmente 4) ya que tiene int s como elementos. Eso significa que en realidad está haciendo que la matriz sea más pequeña después del primer cambio de tamaño, y luego continúa escribiendo más allá del final de la matriz.
Agregar * sizeof(int) tal como lo tiene en su línea malloc debería solucionarlo:
text_arr = (int*)realloc(text_arr, text_len * sizeof(int));Considere lo que sucede la primera vez que se aumenta text_len (de 1 a 2). Originalmente había asignado bytes sizeof(int) a text_arr . Sin embargo, cuando llama a realloc(text_arr, text_len) y text_len es 2, está truncando la matriz de 4 bytes a 2 (suponiendo que sizeof(int) es 4).
text_arr no debería ser un int* ya que está leyendo caracteres individuales y haciendo referencia a ellos mediante text_arr[n] . En su lugar, debe ser un char* y asignado por malloc(1*sizeof(char)) (o simplemente malloc(1) ya que sizeof(char) se define como 1).
Además, con este cambio, no podrá almacenar el valor de retorno de fgetc en la matriz cuando sea igual a EOF . Por lo tanto, debe almacenar el valor de retorno en una variable int real y luego, si no es EOF , almacenarlo en la matriz.