0

我有以下结构:

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 方法时,Person 中的所有值都正确传递,除了 p->Id.number。这在方法调用之前和方法调用之后完全混淆了。

解决了问题 2 而不是我尝试的 memcpy db->next = a ; 以及手动分配所有值。但是在那条线上程序正在崩溃,我假设导致 db->next 当前为 NULL

至于错误,没有错误显示。该程序只是崩溃。

感谢您提供任何解决方案

4

2 回答 2

2

你有

while (db->next != NULL )
/* ... */
memcpy(db->next

根据定义,这总是错误的,因为它总是会memcpy进入NULL. 您需要将东西分配给db->next. 我怀疑你只需要放弃memcpy并说:

db->next = createNewPList();

编辑

在看到更多令人惊叹的代码之后,您可能想要:

db->next = malloc(...);
memcpy(db->next, &a ... );
于 2013-01-06T18:41:09.967 回答
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当你不再需要它们时,不要忘记通过你的和释放每个指针。

于 2013-01-06T18:51:19.393 回答