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

标签 c arrays memory-management malloc

<分区>

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

此外,当我尝试free char **arr(我代码的最后一部分)时,有时我会遇到段错误,有时 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 的大小参数是要分配的新字节数。在您的情况下,它可能是 (counter + 1) * sizeof(char *) 字节。如果文件包含超过一千个单词,那么 5000 是不够的。更不用说您调用 realloc 以在第一次调用后不更改大小。

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


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

而是使用一个临时变量,在将原始指针变量赋值给原始指针变量之前检查该变量:

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

arr = temp;

关于c - 从文件(未知长度)读取时如何正确 malloc 和 free char**?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46770866/

相关文章:

arrays - 将数组从 AppDelegate 传递到 View Controller

java - java中如何将一个多维数组的维度传递给另一个多维数组?

java - 使用 BufferedReader 进行递归

c - 为什么我们要将一段代码放在大括号内?

ios - 从 iOS Xcode 5 中的数组列表中一一显示字符串

c - 分配和分配 : different memory size allocated

c++ - std::bad_alloc 和 GSL ODE 求解器

android - 通过处理程序、消息和包最小化内存分配

c - sprintf 似乎正在四舍五入?

mysql - 编译MySQL C API客户端未链接libmysqlclient.so.20