Todo lo que hace es ejecutar funciones, pero por alguna razón no se rompe después de presionar r , simplemente ejecuta la función y luego finaliza el programa.
int main() { char key = 0; PPMImage *img = NULL; do { puts("\tPress r to read in an image in ppm format"); puts("\tPress s to save image in ppm format"); puts("\tPress q to quit"); scanf(" %c", &key); clear_to_end(stdin); switch (key) { case 'r': load_file("fname"); free(img->data); break; case 's': save_file(img); break; case 'q': puts("\tTerminating program..."); break; default: puts("\tInvalid Input"); break; } } while (key != 'q'); }La razón por la que el programa sale es porque tiene un comportamiento indefinido:
load_file("fname"); puede cargar el archivo de imagen, pero no se produce ningún efecto secundario en imgfree(img->data); anula la referencia del puntero nulo img , lo que provoca una falla de segmentación y la finalización del programa. Suponiendo load_file devuelve un puntero a PPMImage y su intención es liberar una imagen leída previamente, cambie el código a:
case 'r': if (img) { // free the previous image // write a function to free what was allocated free_file(img); } img = load_file("fname"); break;