Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/65.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C fgets()在main()之外的行为异常_C_Linux_Stdio - Fatal编程技术网

C fgets()在main()之外的行为异常

C fgets()在main()之外的行为异常,c,linux,stdio,C,Linux,Stdio,我试图在一个名为“a_function()”的函数中运行fgets() 但是,这样做会导致在调用fgets()函数时发生segfault。有趣的是,我可以将代码从_函数逐字复制到main()函数中,一切都正常运行: #include <stdio.h> #include <stdlib.h> int a_function(){ return 0; } int main(void){ a_function(); char* str;

我试图在一个名为“a_function()”的函数中运行fgets()

但是,这样做会导致在调用fgets()函数时发生segfault。有趣的是,我可以将代码从_函数逐字复制到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;

}

我错过了什么?是我的代码有问题还是我的电脑有问题?感谢您的帮助。谢谢

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

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

char* str;
fgets( str, 6, fp );
在这两种情况下,您都在执行上述代码,这里的
str
未初始化,其中包含不确定的值,输入到其中会导致未定义的行为。这两种情况都是错误的,即使它有时不会崩溃

尝试执行以下操作:

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

提示:您告诉fgets
在哪里存储它读取的字符串?
str
需要进行malloced,或者制作成普通字符[]谢谢!这似乎就是问题所在。我想知道为什么它在main()中起作用?@J.Doe它是UB不管它有时起作用,这只是巧合。我们应该编写健壮的代码,而不是依赖于危险的行为@J.Doe:Flatter是对的:您的代码能够正常工作的事实是一个小小的奇迹。不能通过未初始化的指针分配数据。除了fluter的解决方案之外,另一个选择是使用
malloc
char* str;
fgets( str, 6, fp );
char str[6];
fgets(str, sizeof str, fp);