目前我在下面有以下代码。 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);
不要使用任意数字。
传递给realloc
的 size 参数是要分配的新字节数。在您的情况下,它可能是 (counter + 1) * sizeof(char *)
字节。如果文件包含大约一千多个单词,那么5000
是不够的。更不用说您打电话realloc
第一次通话后不要更改大小。
也不要使用任意值进行malloc
调用。要么使用 strlen(string) + 1
,要么如果可用,那么您可以使用strdup
代替。
最后,不要重新分配给作为指针传递给realloc
的变量。如果realloc
失败并返回NULL
您将丢失原始指针。
相反,请使用在为 backt o 分配原始指针变量之前检查的临时变量:
char **temp = realloc(arr, ...);
if (temp == NULL)
{
// ERRORO: Do something appropriate
}
arr = temp;
检查 getline() 的手册,如果 * 为 NULL,此函数将为您分配行。使用这个函数可能是一种正确的方法,而不是使用 strlen 和 fscanf。