目前我在下面有以下代码。 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);
答案 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。