【问题标题】:C Program crashes when calling Opendir after printf在 printf 之后调用 Opendir 时 C 程序崩溃
【发布时间】:2014-06-16 19:50:48
【问题描述】:

我正在编写一个程序来列出文件夹中的文件。 在下面的代码中,它运行良好,但如果我取消注释

//printf("This makes the program crash.\n");

然后再次运行程序崩溃。它不会打印出“打开的文件夹”,因此它会在 opendir 上崩溃。如果我在 getfiles 函数中定义 'd' 而不是将其传入,它也会崩溃。我正在使用 MinGW 进行编译。我的程序在下面。

#include <stdio.h>
#include <dirent.h>

    void getfiles(DIR *d) {
        //DIR* d;
        struct dirent *dir;
        char* folder_dest;
        printf("Please enter name of upload folder.\n");
        scanf("%s", folder_dest);
        d = opendir(folder_dest);
        printf("folder opened\n");  //does not print when it crashes

        if (d) {
            while ((dir = readdir(d)) != NULL) {
                if( dir->d_type != DT_DIR) {
                    printf("%s\n", dir->d_name);
                }
            }
            closedir(d);
        }
    }

    int main(void) {
        DIR *d;
        //printf("This makes the program crash.\n");
        getfiles(d);
        return(0);
    }

【问题讨论】:

  • 首先要做的是回显您的输入。您应该检查来自scanf() 的返回值——如果它不是 1,则根本不应该使用该值。然后你应该打印你的程序实际得到的字符串:printf("Got: &lt;&lt;%s&gt;&gt;\n", folder_dest);——然后你可以看到它在做什么,而不是猜测。但是您没有像ouah diagonsed 那样分配空间,这是造成麻烦的主要原因。

标签: c crash printf opendir


【解决方案1】:
char* folder_dest;
scanf("%s", folder_dest)

folder_dest 未在您的程序中初始化并指向随机内存地址。 scanf 将在写入字符时调用未定义的行为。使用字符数组而不是 char 指针。更好的解决方案是使用fgets 加上sscanf 而不是scanf

【讨论】:

  • 如果我在 main 中包含 printf,为什么只会导致程序崩溃?
  • @Galarodo:这就是未定义行为的美妙之处。它可以以许多不同的方式表现出来。您可能会在错误的地方践踏内存,从而导致崩溃。但是,从您调用未定义行为(通过将未初始化的指针传递给scanf())开始的任何时候,程序都会以它选择的任何奇怪方式崩溃,问题仍然是scanf() 调用。
猜你喜欢
  • 1970-01-01
  • 2014-10-03
  • 1970-01-01
  • 2020-03-28
  • 1970-01-01
  • 2012-04-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多