复制到C&amp ;;中的Null位置时崩溃传递的数据无效

时间:2013-01-06 18:37:12

标签: c memory crash null

我有以下结构:

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

对于错误,没有显示错误。该程序简直崩溃。

感谢任何解决方案

2 个答案:

答案 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并在你不再需要时释放每一个指针。