【发布时间】:2015-04-13 23:30:21
【问题描述】:
我正在尝试使用 fgets() 从文件中读取文本,但一直遇到分段错误。该程序读取整个文件,然后在读取最后一行后崩溃。任何帮助,将不胜感激。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
char *readFile(FILE *);
char *readFile(FILE *file){
int *outputSize = (int *)malloc(sizeof(int));
(*outputSize) = 1024;
char *buf = (char *)malloc(sizeof(char)*1024);
char *output = (char *)malloc(sizeof(char)*(*outputSize));
*output='\0';
while(fgets(buf,1024,file)){
if(strlen(output)+strlen(buf)+1>(*outputSize)){
printf("REALLOCATING...");
(*outputSize) *=2;
output = realloc(output,sizeof(char)*(*outputSize));
}
printf("BUFFER SIZE: %d\nBUFFER : %s\n",strlen(buf),buf);
strcat(output,buf);
printf("OUTPUT SIZE: %d\nOUTPUT: %s\n",strlen(output),output);
}
printf("FREEING...");
free(outputSize);
free(buf);
return output;
}
【问题讨论】:
-
char *output = (char *)malloc(sizeof(char)*(*outputSize));*output=0; -
if(strlen(output)+strlen(buf)+1>(*outputSize)){ -
malloc不会清除内存,因此将'\0'放在第一个字符中可以保证第一个strcat可以正常工作。如果你很幸运并且在output中有一个初始的 0,那么你就不会注意到这个问题。如果最后一个printf(...,output);看起来正确,那么崩溃不在您发布的代码中。 -
@BLUEPIXY cmets 确实有帮助。可能还存在其他问题。
-
重新分配可能仍然不够大:建议
if(strlen(output)+strlen(buf)+1>(*outputSize)){-->while(strlen(output)+strlen(buf)+1>(*outputSize)){尽管给定代码的逻辑,1 pass 应该就足够了。只需添加一些防御性编码即可。