繁体   English   中英

读取文本文件时免费C

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM