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 未解決 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()設定する必要があります。nextcreateNewPList()

db->next = createNewPList();

linked list必要がなくなったら、すべてのポインターを解放することを忘れないでください。

于 2013-01-06T18:51:19.393 に答える