【问题标题】:fclose(stdout) causes a crash when using freopen even after NULL check即使在 NULL 检查后使用 freopen 时,fclose(stdout) 也会导致崩溃
【发布时间】:2018-04-18 14:11:35
【问题描述】:

我正在尝试使用 freopen 将标准输出打印到文件,但下面的代码崩溃了。我正在检查 NULL,并且我很确定我在程序的其他地方没有分段错误,因为我验证了我所有的 malloc 都是正确的。

程序在到达fclose(stdout) 时崩溃,并且没有打印我附加的错误消息来检查它。 printf("\nTestBeforeClose"); 行打印,但 printf("\nTestAfterClose"); 不打印。

int printAllVarRedir(char * filename, int redirmarker) {
    var *current = NULL;

    if (redirmarker == 1) {
        if (freopen(filename, "w", stdout) == NULL) {
            perror("Unable to open file");
            return 1;
        } else {
            if (head == NULL) {
                perror("No Variables");
                fclose(stdout);
                return 1;
            } else {
                current = head;
                printf("%s=%s. Address is %p.Next is:%p\n", current->varname, current->value, current, current->next);
                while (current->next != NULL) {
                    current = current->next;
                    printf("%s=%s. Address is %p.Next is:%p\n", current->varname, current->value, current,
                           current->next);
                }
                printf("\nTestBeforeClose");
                if (fclose(stdout) == EOF) {
                    printf("\nError is %s\n", strerror(errno));
                }
                printf("\nTestAfterClose\n");
                return 0;
            }
        }
    }
}

这是我正在使用的 var 结构:

typedef struct varlist{
    char * varname;
    char * value;
    struct varlist * next;
}var;

var * head = NULL;

【问题讨论】:

  • 您是否尝试过使用调试器来逐步了解正在发生的事情和/或从崩溃点追溯?如果没有,请学习这项基本技能,这将帮助您理解您的代码,并通过让您解决自己的问题而不是询问互联网来节省您和他人的时间。
  • 请创建一个minimal reproducible example 来演示问题,以便我们自己运行代码。如果链表代码不直接相关,则将其省略。创建 MCVE 可以帮助您识别问题。
  • @JohnKugelman 当我制作一个 MCVE 只是想使用 freopen 时,打印一些东西并 fclose(stdout) 它可以工作。当我使用这个函数和链表时它不起作用。
  • 如果您关闭stdout,您希望TestAfterClose 出现在哪里?
  • 你为什么要重定向stdout?为什么不直接使用fprintf()

标签: c fclose freopen


【解决方案1】:

当然printf("\nTestAfterClose\n"); 不会打印。 printf 打印到您刚刚关闭的 stdout

【讨论】:

  • 谢谢!通过更改代码以使用 dup 而不是 freopen 解决
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多