【发布时间】:2021-08-26 20:46:18
【问题描述】:
我是 C 的新手,必须在大学使用它,并且在 atm 上真的很挣扎。
我们得到了一些代码,并且必须在其中编写一些函数,以便它们与我们得到的东西一起工作。
我的代码:
int readData(char *path, linkedList *list, meal **menu) {
/* --- Config --- */
int ctr=0; //to count parsed lines
int linesCount=1; //to count lines in file first
char ch; //char to check while counting lines
FILE *fp = fopen(path, "r"); //file to read from
FILE *fp2 = fopen(path, "r"); //file to read from
char chunk[128]; //buffer for each line
customerParty *newCustomer;
/* --- Code --- */
//count lines to malloc enough memory afterwards
while((ch=fgetc(fp2))!=EOF) {
if(ch=='\n')
linesCount++;
}
//allocate memory
newCustomer = malloc(linesCount * sizeof(customerParty));
//read file line by line, initialize a newCustomer out of each line
while(fgets(chunk, sizeof(chunk), fp) != NULL) {
parseLine(chunk, &newCustomer[ctr], menu);
listInsert(list, &newCustomer[ctr]);
ctr++;
}
//close files
fclose(fp2);
fclose(fp);
return ctr;}
并且提供的代码/类执行此操作(缩短)
void listRemove(linkedList *list, customerParty *elem) {
{...}
elem->next = NULL;
free(elem->name);
free(elem->order);
free(elem);}
从 gdb 我知道 free(elem->order) 不是问题,而是 free(elem),但为什么会这样呢?为什么它不能释放我分配的内存? 我总是收到“双重释放或损坏(输出)”错误。
非常感谢您的帮助!谢谢!
#edit:感谢您的帮助!
我的代码应该做什么?
- 获取一个文件并为该文件中的每一行创建一个 newCustomer
- 在每个 newCustomer 上调用 parseLine 函数(只是用每一行的信息填充结构)
- 调用 listInsert 函数将其添加到列表中
我不允许更改 listRemove 函数中的任何内容,他们特别说我们应该对其进行编程,以便他们的代码可以正确释放内存。目前,我的代码创建了 newCustomer 结构并将它们完美地填充到列表中,但最后的释放是问题所在。 这是我唯一使用 malloc 的地方,我只是想创建一个包含 N 个 customerParty 的数组来填充它们。
【问题讨论】:
-
我们需要足够的代码来复制问题。我们看不到这些东西是如何分配的,因此无法判断它们是否被正确释放。
-
给定
char ch,(ch=fgetc(fp2))!=EOF无法可靠地检测到文件结束,因为EOF是一个整数值,它可以' t 适合char。 -
为了帮助分配内存,所有
malloc()和free()相关的代码都应该出现在问题中。您的问题包含更多free调用,malloc调用,这至少是可疑的。
标签: c linked-list malloc dynamic-memory-allocation free