我编写了以下程序来从文件中读取字符串并将它们存储到数组中,这些数组在结构中固定了列数和可变行数。
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]);
}
如何从内存中正确释放它们?
答案 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);
您可能还应该检查每个分配以查看它是否也失败,因为在这种情况下继续可能会引起很大的悲痛。