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);
我正在尝试 运行 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);