fgets() 在 main() 之外表现出意外

fgets() behaves unexpectedly outside of main()

我正在尝试 运行 fgets() 在一个名为 "a_function()" 的函数中。

int a_function(){
    char* str;
    FILE *fp;

    fp = fopen( "./file.txt", "r" );
    if( NULL != fp ){
        fgets( str, 6, fp );
        printf( "%s\n", str );
    }else{
        printf( "cannot find file\n" );
        return 1;
    }
    return 0;
}

int main(void){

    a_function();

    return 0;

}

然而,这样做会导致在调用 fgets() 函数时发生段错误。有趣的是,我可以将我的代码从 a_function 逐字复制到我的 main() 函数中,并且一切 运行 都很好:

#include <stdio.h>
#include <stdlib.h>

int a_function(){

    return 0;
}

int main(void){

    a_function();
    char* str;
    FILE *fp;

    fp = fopen( "./file.txt", "r" );
    if( NULL != fp ){
        fgets( str, 6, fp );
        printf( "%s\n", str );
    }else{
        printf( "cannot find file\n" );
        return 1;
    }
    return 0;

}

正在通过以下方式编译代码:

gcc -g -std=c11 test.c -o test

我在这里错过了什么?是我的代码有问题还是我的电脑有问题?任何帮助表示赞赏。谢谢

str 未初始化,即它未指向有效内存。所以 fgets 导致未定义的行为。

要修复它,请将 char* str 更改为 char str[6];

char* str;
fgets( str, 6, fp );

在这两种情况下你都在做上面的代码,这里 str 没有初始化,它包含不确定的值,输入它会导致未定义的行为。这两种情况都是不正确的,即使它有时不会崩溃。

尝试执行以下操作:

char str[6];
fgets(str, sizeof str, fp);