Проблема с null
не могу понять почему выдает ошибку и я не могу выйти из цикла while в функции task, на одной из итераций в цикле for в отладчике пишет ошибку - task было nullptr, но у меня в условии написано что при nullptr нужно выйти. что не так понять не могу. код не полный, для общего понимания вырвал куски.
class list
{
public:
list(int size);
~list();
void task();
void start(char data);
void add(char data);
void show();
void del(int pos);
struct node
{
char data;
node* next;
node* prev;
};
private:
node* head;
node* tail;
int size;
};
void list::task()
{
for (int i = 0; i < size; i++)
{
node *task = head;
char ss = '*';
while(task->data != ss|| task != nullptr)
{
task = task->next;
}
if (task->data == ss)
{
node* deltask = task->prev;
node* prevtask = task->prev;
node* aftertask = task->next;
prevtask = prevtask->prev;
aftertask->prev = prevtask;
prevtask->next = aftertask;
delete deltask;
delete task;
}
}
}
int main()
{
first.task();
cout << "Результирующий список : ";
first.show();
return 0
}
Ответы (1 шт):
Может, не "или", а "и"? Потому что при task == nullptr выхода все равно нет, вернее, есть аварийный — при попытке разыменовать нулевой указатель.
Чтобы его не разыменовывать (представьте, что у вас уже task — нулевой... и вы начинаете искать task->data), надо правильно расставить операнды ||, чтобы воспользоваться сокращенным вычислением:
while(task != nullptr && task->data != ss)
или, еще проще,
while(task && task->data != ss)
По тем же соображениям о разыменовании следующая проверка должна быть не
if (task->data == ss)
а
if (task)