копирование структуры в связанном списке - PullRequest
0 голосов
/ 10 мая 2011

Здесь я копирую структуру с одного узла на другой, но когда я сталкиваюсь с последним узлом, у меня будет ошибка сегментации, так как temp_clsf->next в memcpy будет указывать на неверное местоположение, как я могу это исправить?Я не могу освободить temp_clsf, так как это не динамическое распределение.

while(temp_clsf!=NULL)
{
    memcpy(&temp_clsf, &temp_clsf->next, sizeof(struct classifier));
    if(temp_clsf->next ==NULL)
        return;
    else
        temp_clsf = temp_clsf->next;
}

Ответы [ 5 ]

1 голос
/ 10 мая 2011

Внутри цикла сохраняйте указатель на предыдущий узел.Когда цикл завершится, обновите этот узел указателем на NULL

/* pseudo-code */
while () {
    prev = curr;
    /* ... */
}
prev->next = NULL;
0 голосов
/ 10 мая 2011

Похоже, что вы делаете смену предметов, потенциально чтобы удалить один. Если бы это был упорядоченный массив, не было бы необходимости использовать указатель next. Я не уверен, какое другое статическое распределение вы используете, но вы можете просто сделать следующее, чтобы удалить один элемент temp_clsf->next:

temp_clsf->next=temp_clsf->next->next;
0 голосов
/ 10 мая 2011

используйте следующее условие в то время как.

while(temp_clsf->next!=NULL)     
0 голосов
/ 10 мая 2011

Потенциально, temp_clsf->next может быть NULL, поэтому передвиньте проверку NULL до memcpy

while(temp_clsf != NULL)
{
    if(temp_clsf->next == NULL)
    {
        return;
    }

    memcpy(&temp_clsf, &temp_clsf->next, sizeof(struct classifier));

    temp_clsf = temp_clsf->next;
}

Обновления : temp_clsf и temp_clsf->nextкак указатели для меня.Итак, ваш memcpy берет адрес указателей и перезаписывает то, что там есть.Это твое намерение?Не уверен, что такое sizeof(struct classifier), так как у нас нет типов структуры в вашем примере.

0 голосов
/ 10 мая 2011

Просто переместите копию после if ...

 while(temp_clsf!=NULL)
    {
    if(temp_clsf->next ==NULL)
    return;
    //else
    memcpy(&temp_clsf, &temp_clsf->next, sizeof(struct classifier));
    temp_clsf = temp_clsf->next;
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...