我有一个关于将fgets()与char * string一起使用的简单问题。
....
char *temp;
FILE fp=fopen("test.txt", "r");
fgets(temp, 500, fp);
printf("%s", temp);
....
此代码效果不佳。
但在我将char *temp
修改为char temp[100];
后,代码运行良好,符合我的预期。
这两者有什么区别?
当我用Google搜索时,有些人说必须使用malloc()将内存分配给char *
...
但我无法理解。
答案 0 :(得分:6)
char * temp只是一个指针。在开始时它不指向任何东西,可能它具有随机值。
fgets()从fp读取500个字节到内存地址,此临时指针指向该内存地址!因此,它可以覆盖事物,它可以使分段错误,并且只有非常低的机会才能正常工作。
但char temp [500]是一个500字节长的数组。这意味着,编译器会在进程开始时(或在调用函数时)进行分配。因此,这500个字节将是一个可用的500字节,但它有一个价格:你不能重新分配,调整大小,免费等等。
谷歌想要你的是这样的:
char *temp = (char*)malloc(500);
并且
free(temp);
在你不再需要它之后。
答案 1 :(得分:2)
char *temp
未初始化,也就是说,它没有指向有效内存。将其设为数组(char temp[]
)或使用malloc
为其分配内存。
答案 2 :(得分:2)
当我们写
时char *temp ;
这意味着temp
是指向char
的未初始化指针,即当前它不包含任何地址。
使用fgets
时,必须传递一个字符串,其中要复制从文件指针读取的字节。 link
由于temp
未初始化,fgets
看起来像这样
fgets(<no string> , 500 , fp ) ;
无效。
因此,我们应该给出初始化的字符串,可以形成:
1) char *temp = malloc(sizeof(500)) ;
or
2) char temp[500] ;
因此,如果我们将初始化的字符串传递给fgets
,它看起来像
fgets( < some string > , 500 , fp) ;