努力学习malloc和free work,但我认为我可能做得对。我在我的测试文件的末尾调用了一个deleteList(),它应该释放所有的内存,但是当我使用valgrind时它表示我仍然分配了内存活动。如果有人知道如何解决这个问题,那就太好了。
测试源文件:
#include "stdlib.h"
#include "string.h"
#include "linked_list.h"
int main(int argc, char* argv[]){
PersonalInfo *head = NULL;
printList(head);
insertToList(&head, 2, "Mike", "Pealow");
printList(head);
deleteList(&head);
return 0;
}
原型文件:
#define NAME_LENGTH 32
typedef struct personalInfo {
struct personalInfo *next;
unsigned int id;
char firstName[NAME_LENGTH];
char familyName[NAME_LENGTH];
} PersonalInfo;
PersonalInfo *insertToList(PersonalInfo **head, unsigned int id, char *firstName, char *familyName);
void printList(PersonalInfo *head);
void deleteList(PersonalInfo **head);
源文件:
#include "stdio.h"
#include "stdlib.h"
#include "string.h"
#include "linked_list.h"
PersonalInfo *insertToList(PersonalInfo **head, unsigned int id, char *firstName, char *familyName){
PersonalInfo *p = (PersonalInfo*)malloc(sizeof(PersonalInfo));
strcpy(p->firstName, firstName);
strcpy(p->familyName, familyName);
p->id = id;
p->next = NULL;
if(*head!=NULL && p!=NULL){
p->next = *head;
return p;
}
else{
printf("Head is null; create new head? (y/n)");
char scChar;
scanf("%c", &scChar);
if(scChar=='y'){
head = &p;
return p;
}
else if(scChar=='n'){
printf("Exiting");
free(p);
p=NULL;
return NULL;
}
else{
printf("Invalid input, exiting");
free(p);
p=NULL;
return NULL;
}
}
}
void printNode(PersonalInfo *node){
printf("%s %s %d", node->firstName, node->familyName, node->id);
}
void deleteList(PersonalInfo **head){
if(*head==NULL)
printf("List is empty\n");
PersonalInfo *next, *currNode = *head;
while(currNode!=NULL){
next = currNode->next;
free(currNode);
currNode = next;
}
currNode = NULL;
}
答案 0 :(得分:1)
我很惊讶你的节目终止了。
首先关闭:
void deleteList(PersonalInfo **head){
if(&head==NULL)
应为:
if( *head==NULL )
因为指向指针的地址总是非NULL,所以你的测试总是失败。
下一步:
printf("List is empty\n");
PersonalInfo *next, *currNode = *head;
while(&currNode!=NULL){
此处相同:&currNode
始终非NULL,因此此条件永远不应为false,即您的程序不应终止。
你需要测试一下:
while( currNode!=NULL )
答案 1 :(得分:0)
我看到你的insertIntoList函数在列表的开头添加了一个新节点,但你永远不会改变对第一个音符(头指针)的引用。因此,当您释放列表时,您只释放最后一个节点。
在你的main()函数中尝试调用head = insertToList(&head, 2, "Mike", "Pealow");
或者如果你在p->next = *head;
之后坚持为insertIntoList的第一个参数添加一个双指针,则添加*head = p
答案 2 :(得分:0)
找出问题所在,我从头部分配内存而不删除它,所以当程序运行时,它仍然会计入内存分配。
在测试源文件中:
PersonalInfo *head = NULL;