fgets()在main()之外意外行为

时间:2016-05-06 01:04:09

标签: c linux stdio

我试图在名为" a_function()"的函数中运行fgets()。

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

我在这里缺少什么?这是我的代码或我的电脑的问题?任何帮助表示赞赏。谢谢

2 个答案:

答案 0 :(得分:5)

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

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

尝试执行以下操作:

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

答案 1 :(得分:2)

str未初始化,即它没有指向有效内存。因此fgets会导致未定义的行为。

要解决此问题,请将char* str更改为char str[6];