【问题标题】:Switch case statement doesn't loopswitch case语句不循环
【发布时间】:2022-01-02 17:09:57
【问题描述】:

它所做的只是运行函数,但由于某种原因,在我按下r 后它并没有中断,它只是运行函数然后结束程序。

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');
}

【问题讨论】:

  • 你认为这段代码中的什么应该让程序“在我按下 r 后中断”?
  • 关于free(img->data);。变量imgNULL 并且没有任何改变(即使在load_filesave_file 中也没有),然后你取消引用它:ka-sloot
  • 啊,是的。这是我犯的一个愚蠢的错误。
  • ...当您致电 save_file(img); 时,这与 load_file 中发生的任何事情都无关。顺便说一句,尽量避免像 clear_to_end(stdin); 这样的杂乱无章,这在此处是不必要的,如果您了解 scanf 如何处理空格(您显然是这样做的),则很少这样做。
  • 应该是免费的(img)吗?另外,您是否在此代码之前的某个地方定义 PPMImage 是什么,如果不使用 unsigned char *img = NULL;

标签: c switch-statement case break


【解决方案1】:

程序退出的原因是它有未定义的行为:

  • load_file("fname"); 可能会加载图像文件,但在img 上不会出现副作用
  • free(img->data); 取消引用空指针 img,导致分段错误和程序终止。

假设 load_file 返回指向 PPMImage 的指针,并且您的意图是释放以前读取的图像,请将代码更改为:

        case 'r':
            if (img) {
                // free the previous image
                // write a function to free what was allocated
                free_file(img);
            }
            img = load_file("fname");
            break;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多