Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

263
Vistas
realloc no copia los valores correctamente

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?

over 4 years ago · Santiago Trujillo
3 Respuestas
Responde la pregunta

0

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);
over 4 years ago · Santiago Trujillo Denunciar

0

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));
over 4 years ago · Santiago Trujillo Denunciar

0

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.

over 4 years ago · Santiago Trujillo Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda