我有一个问题,我真的不知道为什么和如何发生。我将尽我所能解释清楚。
代码有两个函数:main函数和assemble函数。在main中,我只是抓取一些参数,这些参数是文档文件方向,然后我将每个参数发送给assemble函数。
在汇编函数中,我打开文件,然后我开始一个链表,我找到第一个节点的内存,然后我添加了很多节点到列表中(这部分我没有复制到这里,因为它很大,但它工作得很好),然后在最后我关闭文件并释放链表。
这是代码:
typedef struct node {
int location;
char name[MAX_LABEL];
char type;
struct node * next;
} labVar;
int main(int argc, char *argv[]) {
if (argc == 1)
printf("No file attached./n");
else {
while(--argc) {
argv++;
assemble(*argv);
}
}
return 0;
}
void assemble(char *file) {
FILE *iofp;
int i = 0;
labVar *nodeLabHead = NULL; /* initializing head of the labels' linked list */
labVar *nodeLabCurr = NULL; /* variable to go through the list */
if ((iofp=fopen(file,"r")) == NULL)
printf("nCan't open file "%s"n", file);
else {
printf("nSuccess opening %sn", file);
nodeLabHead = (labVar *) malloc(sizeof(labVar));
if (nodeLabHead == NULL) {
printf("nNo memory to allocate.n");
exit(0);
}
/*HERE I FILL THE LINKED LIST WITH MANY NODES IN ANOTHER FUNCTION, IT WORKS*/
fclose(iofp);
while (nodeLabHead->next != NULL) {
nodeLabCurr = nodeLabHead;
nodeLabHead = nodeLabHead->next;
free(nodeLabCurr);
}
free(nodeLabHead);
}
}
所以,代码似乎可以很好地处理我作为参数发送的所有类型的文件。但是,当我尝试使用多个参数运行代码(为每个参数调用append函数)时,它会进入无限循环。我理解它与释放内存有关因为它被困在那个循环中了。如果删除最后一行(free(nodeLabHead);),只有当我输入具有更多节点的文件,然后是具有较少节点的文件时,它才会卡住,否则它会工作。
我还注意到,在开始时,当将内存分配给第一个节点时,nodeLabHead->next==NULL如预期的那样返回1,但是在第二次它到达那里时(对于第二个文件,nodeLabHead->next==NULL返回0,这意味着它没有真正释放,我不明白为什么。
您没有显示您的代码,但听起来好像您从未将nodeLabHead->初始化为NULL,因此它包含分配的内存中的任何内容。当你第一次调用你的函数的时候,它是0,但是之后它就不是0了。
您从malloc
返回的内存是未初始化的——因此可能包含任何内容。如果你想让它有一个可预测的值,你需要显式地设置结构体的每个字段。
尝试将malloc
呼叫改为calloc
,或在malloc
呼叫后添加memset(nodeLabHead, 0, sizeof(labVar))
。