C - 如何正确释放指向 n 字符数组 ((*p)[n]) 的指针的内存?

标签 c arrays pointers memory memory-management

我编写了以下程序来从文件中读取字符串并将它们存储到结构中固定列数和可变行数的数组中。

FILE *fp;
typedef struct {
char  (*date)[12],
      (*content)[50],
      (*amount)[10];
} list;
list in;
int i,lines;
fp = fopen("book.txt","r");
lines = 100;
in.date = malloc(lines * 12 * sizeof(char));
in.content = malloc(lines * 50 * sizeof(char));
in.amount = malloc(lines *10* sizeof(char ));

printf("%-12s%-40s%-10s\n","Date","Content","Amount");

for(i = 0;i <lines;i++){
    fscanf(fp,"%s\t%[a-z|A-Z| ]\t%s\n",in.date[i],in.content[i],in.amount[i]);
    printf("%-12s%-40s%-10s%\n",in.date[i],in.content[i],in.amount[i]);
}

我可以为行分配内存,但是当释放内存时程序将停止工作,如下所示:

for(i = 0;i < lines;i++){
        free(in.date[i]);
        free(in.content[i]);
        free(in.amount[i]);
    }

如何正确地将它们从内存中释放?

最佳答案

您正在分配一个数组,但试图释放每个单个事物,而您需要做的是释放数组。

通常,清理意味着释放您分配的每个对象(如果它们之间存在任何交叉链接,则按相反的顺序释放)。如果该对象是一个数组,则释放该数组。不要尝试释放数组的部分内容。

根据 C11 7.22.3.3 自由函数/2:

... if the argument does not match a pointer earlier returned by a memory management function, ... the behavior is undefined.

这意味着您需要执行以下操作:

in.date = malloc (lines * 12);    // sizeof(char) is ALWAYS 1
in.content = malloc (lines * 50); //   so TOTALLY unnecessary.
in.amount = malloc (lines * 10);
:
// use them here
:
free (in.amount);
free (in.content);
free (in.date);

您可能还应该检查每个分配,看看它是否也失败,因为在这种情况下继续可能会造成很大的痛苦。

关于C - 如何正确释放指向 n 字符数组 ((*p)[n]) 的指针的内存?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29531014/

相关文章:

c - 在这种情况下比较字符串指针是否有效?

javascript - 如何向数组添加项目而不在回调函数外部声明数组?

c - 应用程序因指针、头文件和结构数组而崩溃

c - 指针和字符串的关系

c - 为什么 scanf 在这里跳过输入?

compilation - GCC 预处理器输出中的调试信息

c# - 如何使用 C 程序中的现有 C# 代码

javascript - 在 Javascript 中将字符串转换为二维数组

c++ - 引用指针的可选参数?

c++ - 有没有办法停止隐式指针转换为 void *