2013-11-25 25 views
3

我有一个关于使用fgets()和char *字符串的简单问题。使用fgets()char *类型

.... 
char *temp; 
FILE fp=fopen("test.txt", "r"); 

fgets(temp, 500, fp); 
printf("%s", temp); 
.... 

此代码无法正常工作。

但是我修改char *tempchar temp[100];后,代码运行得很好,就像我打算的那样。

这两者有什么区别?

当我GOOGLE了它,也有人说内存必须使用malloc()...

被分配到char *但我无法理解。

+1

如果你不分配内存指针指向什么?要记住这一点,在声明后立即将指针指向空指针。当释放指针的内存时,它将保留。在删除后也会将空指定为空。没有内存分配指针是一个非常常见的错误,并给你可怕的分段错误。 –

回答

2

char *temp是未初始化的,也就是说,它没有指向有效的内存。将其作为数组(char temp[])或使用malloc为其分配内存。

+0

非常感谢。 :) – user3033077

5

char * temp只是一个指针。在开始时它并不指向任何东西,可能它有一个随机值。 (f)从fp读取500字节到内存地址,这个temp指针指向的地方!所以,它可以覆盖事物,它可以产生分割错误,只有非常低的机会才能正常工作。

但char temp [500]是一个500字节长的数组。这意味着,编译器会在进程开始时(或在调用函数时)执行分配。因此,这500个字节将是一个可用的500字节,但它有一个价格:你不能重新分配,调整大小,释放等等。

的谷歌从你想要的东西,是这样的:

char *temp = (char*)malloc(500); 

而一个

free(temp); 

你不需要这之后了。

+1

在C中,没有必要强制转换'malloc/calloc/realloc'的结果,也不推荐:http://stackoverflow.com/a/605858/694576 – alk

+0

直到我这样做只是为了避免gcc警告,但他的观点很强。 – peterh

+0

非常感谢。 :) – user3033077

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) ; 
+0

oh..yes,对不起。 – Subbu

+0

非常感谢。 :) – user3033077

+0

这是一个缓冲区溢出。 'malloc(sizeof(500))'将分配大约4个字节,而不是500个。 – Bilow