c - fclose(stdout) 在使用 freopen 时即使在 NULL 检查后也会导致崩溃

标签 c fclose freopen

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

程序在到达 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;

最佳答案

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

关于c - fclose(stdout) 在使用 freopen 时即使在 NULL 检查后也会导致崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49901957/

相关文章:

c - 我正在尝试将值直接插入双指针矩阵,如下所示

C - 用静态数据填充结构的方法

函数指针的正确使用

C - 通过调用 fclose() 转储核心

c++ - 系统 ("pause") 不适用于 freopen

c - 在循环中重新分配文件指针

c - C中奇怪的内存分配代码,它是如何工作的?

php-5.3 - 为什么 PHP fopen + fwrite 会出现双文档?

php - 不使用 fclose() 覆盖文件句柄会产生缺陷吗?

java - 相当于 Java 中的 freopen