C语言 从文件读取时如何正确 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); 

不要使用任意数字。

传递给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。

相关内容

  • 没有找到相关文章