[英]C Free While Reading Text File
我正在研究一个项目,在此程序中,我想逐行阅读给定的txt文件。 每行之间用空格隔开,并在该行中获得单词数组。 该操作之后,我想释放所有malloc,但是当我尝试释放它时会出错。
FILE * filePointer;
char * lineFromText = NULL;
size_t lengthOfLine = 0;
ssize_t lastIndexOfText;
filePointer = fopen("/home/ogr/b21xxxxxxx/input5.txt", "r");
if (filePointer == NULL)
exit(EXIT_FAILURE);
char **array=malloc(sizeof(char*)*10);
int i;
for (i=0; i<10; i++) {
array[i] = malloc(10 * sizeof(char*));
}
while ((lastIndexOfText = getline(&lineFromText, &lengthOfLine, filePointer)) != -1)
{
lineFromText[lastIndexOfText-2]='\0';
char * pch = malloc(10 * sizeof(char));
strcpy(pch,strtok (lineFromText," "));
while (pch != NULL)
{
int loop;
array[0]=pch;
if(array[0]==NULL) {
printf("No test to search.\n");
exit(0);
}
for(loop=1;loop<10;loop++) {
array[loop]=strtok(NULL," ");
if(array[loop]==NULL)
break;
}
for(loop=0;loop<10;loop++) {
if(array[loop]==NULL)
break;
printf("Item #%d is %s\n",loop,array[loop]);
}
pch = strtok (NULL, " ");
}
}
fclose(filePointer);
int j;
for (j = 0; j < 10 ; j++) {
free(array[j]);
}
您可以从此处查看文本文件: input5.txt
之所以会出现免费错误的原因是,您正在破坏最初由malloc返回的指针。 但是真正的原因是更深层次的。
让我们首先处理该免费错误。 这是分配内存的方式:
for (i=0; i<10; i++) {
array[i] = malloc(10 * sizeof(char*));
}
在这里,10个数组条目中的每个条目都分配有malloc
调用返回的指针。 每个指针指向40或80字节的内存块(在x86上sizeof(char*)
给出4,在x64上给出8)。
要释放该内存,应将malloc
返回的指针传递给free
函数:
int j;
for (j = 0; j < 10 ; j++) {
free(array[j]);
}
但由于以下代码,它不适用于您的情况:
char * pch = malloc(10 * sizeof(char));
strcpy(pch,strtok (lineFromText," "));
while (pch != NULL)
{
int loop;
array[0]=pch;
...
for(loop=1;loop<10;loop++) {
array[loop]=strtok(NULL," ");
if(array[loop]==NULL)
break;
}
在这里,您用strtok
返回的地址覆盖了malloc
最初返回并存储在array
的地址。 因此,所有分配的内存都在泄漏, free
内存时出现错误原因,其中array[0]
包含pch
地址(最后一行的第一个字),而array[1]
包含pch
加上第二个字偏移地址,已在第一个循环迭代中释放。
真正的事实是,除了由getline
完成的内存分配之外,您实际上不需要任何额外的内存分配。 首先,您可以声明一个静态分配的指针数组:
char *array[10];
代替:
char **array=malloc(sizeof(char*)*10);
int i;
for (i=0; i<10; i++) {
array[i] = malloc(10 * sizeof(char*));
}
然后像这样初始化pch
:
char *pch = strtok (lineFromText," ");
代替:
char * pch = malloc(10 * sizeof(char));
strcpy(pch,strtok (lineFromText," "));
处理完成后,它仅保留释放lineFromText
缓冲区,因为它由getline
分配:
free(lineFromText)
代替:
int j;
for (j = 0; j < 10 ; j++) {
free(array[j]);
}
希望对您有所帮助。 祝好运。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.