#c
#c
Вопрос:
Здесь я копирую структуру с одного узла на другой, но когда я сталкиваюсь с последним узлом, у меня будет ошибка сегментации, поскольку temp_clsf->next
in memcpy
будет указывать на недопустимое местоположение, как я могу это исправить? Я не могу освободить temp_clsf
, поскольку это не динамическое распределение.
while(temp_clsf!=NULL)
{
memcpy(amp;temp_clsf, amp;temp_clsf->next, sizeof(struct classifier));
if(temp_clsf->next ==NULL)
return;
else
temp_clsf = temp_clsf->next;
}
Комментарии:
1. @cnicutar: я дал подробное объяснение здесь, и я застрял в этом, не в состоянии продолжить
2. Я вообще этого не понимаю. Кажется безумием копировать весь ваш список каждый раз, когда вы удаляете элемент. Я не понимаю, почему вы просто не указываете изменить начало вашей точки списка на следующий указатель текущего первого узла…
Ответ №1:
Внутри цикла сохраните указатель на предыдущий узел. Когда цикл завершится, обновите этот узел указателем на NULL
/* pseudo-code */
while () {
prev = curr;
/* ... */
}
prev->next = NULL;
Ответ №2:
Просто переместите копию после if
…
while(temp_clsf!=NULL)
{
if(temp_clsf->next ==NULL)
return;
//else
memcpy(amp;temp_clsf, amp;temp_clsf->next, sizeof(struct classifier));
temp_clsf = temp_clsf->next;
}
Ответ №3:
используйте следующее условие в while.
while(temp_clsf->next!=NULL)
Комментарии:
1. если
temp_clsf
само по себе равно NULL, то при сравнении будет предпринята попытка разыменования нулевого указателя: лучший тест для обоих:while(temp_clsf!=NULL amp;amp; temp_clsf->next!=NULL)
Ответ №4:
Потенциально, temp_clsf->next
может быть NULL
, поэтому переместите NULL
проверку перед memcpy
while(temp_clsf != NULL)
{
if(temp_clsf->next == NULL)
{
return;
}
memcpy(amp;temp_clsf, amp;temp_clsf->next, sizeof(struct classifier));
temp_clsf = temp_clsf->next;
}
Обновление: temp_clsf
и temp_clsf->next
для меня выглядят как указатели. Итак, вы memcpy
берете адреса указателей и перезаписываете то, что там есть. Это ваше намерение? Не уверен, что sizeof(struct classifier)
такое, поскольку у нас нет типов структуры в вашем примере.
Комментарии:
1. если я сделаю это, последняя структура не будет скопирована, поскольку temp_clsf-> next будет указывать на null, но данные, которые у меня есть в этот момент temp_clsf, должны быть скопированы в предыдущую структуру
2. Итак, memcpy действительно должен копировать данные, а не указатели, верно? Какова структура типа для temp_clsf/classifier?
3. structure1-> structure2-> structure3-> structure4-> structure5 здесь я хочу выполнить memcpy, т.Е. если я удалю structure1, я хочу, чтобы результат был похож на structure1-> structure2-> structure3-> structure4-> structure5, но в моем коде я удалил structure1, я хочу, чтобы результирующая структура была такой structure2-> structure3-> structure4 -> structure5 но я для своего кода получаю o / p, подобный этому structure2-> structure3-> structure4-> structure4-> structure5 когда дело доходит до structure5 temp_clsf-> next будет равен NULL, и он выйдет из цикла.
Ответ №5:
Похоже, что вы выполняете сдвиг элементов, возможно, для удаления одного. Если бы это был упорядоченный массив, не было бы необходимости использовать next
указатель. Я не уверен, какое другое статическое распределение вы используете, но вы можете просто сделать следующее, чтобы удалить отдельный элемент temp_clsf->next
:
temp_clsf->next=temp_clsf->next->next;