如何正确地从文件(未知长度)读取malloc和free char **?

时间:2017-10-16 12:55:00

标签: c arrays memory-management malloc

目前我在下面有以下代码。 char **arr最初设置为NULL。然后它在从文件中读取时存储在单词中。我只是随机选择了一个像5000那样的大数字,因为即使在网上查看并尝试学习之后,我也无法理解如何正确地进行malloc业务。

此外,当我尝试free char **arr(我的代码的最后一部分)时,有时会收到segmentation faults,有时会收到abort traps等。如果有人可以展示我如何正确地做这样的事情,我将非常感激!谢谢!

char **arr = NULL 

File *fp = fopen("file.txt", "r")
char string[3000];
char counter = 0; 


//to store
while(fscanf(fp, "%s", string)!=EOF){ 
    arr = realloc(arr, 5000); //arbitrarily used a large number like 5000 
    arr[counter] = malloc(5000); 
    strcpy(arr[counter++], string); 
}

//to free

for(i=0; i<counter; i++){
    free(arr[i])
} 
free(arr); 

2 个答案:

答案 0 :(得分:4)

不要使用任意数字。

传递给realloc的size参数是要分配的新字节数。在您的情况下,它可能是(counter + 1) * sizeof(char *)个字节。如果文件包含超过大约一千个单词,那么5000将是不够的。更不用说你在第一次通话后呼叫realloc不改变大小。

也不要为malloc调用使用任意值。使用strlen(string) + 1,或者如果可用,则可以使用strdup

最后,不要将您传递的变量重新指定为指向realloc的指针。如果realloc失败并返回NULL,您将丢失原始指针。

而是使用在为原始指针变量分配backt之前检查的临时变量:

char **temp = realloc(arr, ...);
if (temp == NULL)
{
    // ERRORO: Do something appropriate
}

arr = temp;

答案 1 :(得分:1)

检查getline()的manual,如果*为NULL,则此函数为您分配行。使用此函数可能是一种正确的方法,而不是使用strlen和fscanf。