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

时间:2018-04-18 14:11:36

标签: c fclose freopen

我正在尝试使用freopen将stdout打印到文件,并且下面的代码崩溃了。我是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;

1 个答案:

答案 0 :(得分:5)

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