Estaba tratando de practicar malloc «ing y liberar memoria, sin embargo, cuando ejecuto la función free () en este programa se devuelve un error para un puntero no válido. ¿Alguien puede decirme qué estoy haciendo mal?
Aquí está el error: * Error en `. / malloc1 «: free (): puntero no válido: 0x000000000216c421 * Abortado
Y aquí está mi código:
include
incluir
int main (void) {// abrir un archivo antiguo FILE * old_file = fopen («words.txt», «r»); if (old_file == NULL) { printf («No se encontró archivo.»); return 1;}
//open a new file FILE* new_file = fopen("new_words.txt", "w"); if (new_file == NULL) { printf("Unable to create file."); return 2; } for (int i = 0; i < 21; i++) { char* storage = malloc(sizeof(char)); if (storage == NULL) { printf("Error."); return 3; } fread(&storage, sizeof(char), 1, old_file); fwrite(&storage, sizeof(char), 1, new_file); free(storage); } //close both files fclose(old_file); fclose(new_file);
}
Respuesta
El problema radica en fread(&storage, sizeof(char), 1, old_file);
Esta línea está almacenando los datos leídos directamente en el puntero, sobrescribiendo la dirección de la memoria malloc «d. No está almacenando los datos en la memoria apuntada por la dirección almacenada en el puntero. Cuando se ejecuta la llamada free (), está intentando liberar una dirección inválida. También está creando una pérdida de memoria porque se está reemplazando la dirección de la memoria d de malloc. Elimine &
de fread () y fwrite () y funcionará.
Si esto responde a su pregunta, haga clic en la marca de verificación para aceptar. Sigamos con el mantenimiento del foro. 😉