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

时间:2015-04-09 06:09:58

标签: 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]);
    }

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

1 个答案:

答案 0 :(得分:1)

你正在分配数组,但是试图释放每个个人的东西,而你需要做的就是释放数组。

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

根据C11 7.22.3.3 The free function /2

  

...如果参数与之前由内存管理函数返回的指针不匹配,则...行为未定义。

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

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);

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