Cita de: rir3760 en 23 Diciembre 2012, 04:04 AM
El problema principal en esa función es el incremento de la variable "array_pointers", al hacerlo pierdes la dirección base. En su lugar:
1) Reservas el bloque de memoria principal, este lo utilizas para almacenar la dirección de memoria de cada cadena.
2) Utilizas un auxiliar para leer la linea. Para esta reservas un bloque de memoria del tamaño apropiado, copias ahí la cadena y guardas su dirección en el bloque principal.
3) Si el bloque principal se llena reajustas su tamaño con realloc.
La función con las correcciones:Código (c) [Seleccionar]#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define NUM_CHARS 4096
void delreves(FILE *entrada);
/* ... */
void delreves(FILE *entrada)
{
char temp[NUM_CHARS];
char **linea;
int i;
int max_lineas = 16;
linea = malloc(max_lineas * sizeof *linea);
i = 0;
while (fgets(temp, NUM_CHARS, entrada) != NULL){
linea[i] = malloc(strlen(temp) + 1);
strcpy(linea[i], temp);
i++;
if (i == max_lineas){
max_lineas *= 2;
linea = realloc(linea, max_lineas * sizeof *linea);
}
}
linea = realloc(linea, i * sizeof *linea);
/* Procesamiento de las lineas ... */
/* Liberacion de la memoria utilizada */
while (i-- > 0)
free(linea[i]);
free(linea);
}
Por cierto no hay validaciones para reducir en lo posible el código fuente, eso te toca a ti.
Un saludo
Tío, no sé como darte las gracias rir3760.
Esa forma de usar el realloc no se me había ocurrido y llevabamos pillados 1 semana(porque los profesores no explican una m...) y el usar el tamaño de p como contador de aumento de memoria ni me había fijado.
De verdad, GRACIAS! Te debo mi aprobado, puto crack.