C fgets()在main()之外的行为异常
我试图在一个名为“a_function()”的函数中运行fgets() 但是,这样做会导致在调用fgets()函数时发生segfault。有趣的是,我可以将代码从_函数逐字复制到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;
#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);