gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 15:21:38 24 4
gpt4 key购买 nike

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

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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com