使用带有char *类型的fgets()

时间:2013-11-25 16:33:17

标签: c string char fgets

我有一个关于将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 * ...

但我无法理解。

3 个答案:

答案 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) ;