我有以下结构:
struct PList{
Person value;
PList* next;
}
和
struct Person{
char name[100];
PersonID ID;
float amountOwed;
}
和
struct PersonID{
int number;
char letter;
}
主要方法:
Person n;
// n is inputted from the user
addPersonToList(&n, &customers); //customers is a PList
这是addPersonToList的代码:
void addPersonToList(Person* p, PList* pdb) {
PList* db;
db = pdb;
while (db->next != NULL ) {
db = db->next;
}
PList a;
a = createNewPList(); // this simply assigns next to NULL and value to an empty Person
a.value = *p;
memcpy(db->next,&a,sizeof(PList)+sizeof(Person)+sizeof(PersonID));
}
这里是createNewPList
PList createNewPList() {
PList a;
a.next = NULL;
a.value = constructPerson("", constructPersonID(' ', 0), 0);
return a;
}
问题1 UNSOLVED 调用addPersonToList方法时,除了p-> Id.number之外,Person中的所有值都会正确传递。这在方法调用之前和方法调用之后完全混淆。
问题2 已解决 而不是memcpy我尝试过db-> next = a;以及手动分配所有值。 但是在那一行程序崩溃了,我假设因为db-> next当前是NULL
对于错误,没有显示错误。该程序简直崩溃。
感谢任何解决方案
答案 0 :(得分:2)
你有
while (db->next != NULL )
/* ... */
memcpy(db->next
根据定义,这始终是错误的,因为它始终memcpy
进入NULL
。您需要将内容分配给db->next
。我怀疑你需要的只是删除memcpy
并说:
db->next = createNewPList();
在看到更多令人惊奇的代码之后,您可能想要:
db->next = malloc(...);
memcpy(db->next, &a ... );
答案 1 :(得分:1)
你的createNewPList()
应该返回指向堆上分配的东西的指针:
PList*
createNewPList(void)
{
PList* a;
if ((a = malloc(sizeof(*a)) == NULL)
return NULL;
a->next = NULL;
a->value = constructPerson("", constructPersonID(' ', 0), 0);
return a;
}
然后,您应该忘记memcpy()
,并将next
设置为createNewPList()
的返回值:
db->next = createNewPList();
不要忘记通过你的linked list
并在你不再需要时释放每一个指针。