Правильно ли я использую эти указатели? Я присваиваю что-то, но сразу после этого становится null

#c #pointers #null

#c #указатели #null

Вопрос:

 if ((*l).proc == NULL)
    {
        (*l).proc = current_process;
        if(current_process == NULL)
        {
            __no_operation();
        }
        if((*l).proc == NULL)
        {
            __no_operation();
        }
    }
  

При запуске этого кода я добавил точки останова при обоих сбоях. Однако оно прерывается только на втором из двух. Как это возможно?

Комментарии:

1. Мог ли компилятор оптимизировать отсутствие операций?

2. Просто используется стиль, но почему бы вам этого не сделать? if (!l->proc) вместо if ((*l).proc == NULL)

3. Другое дело, что такое current_process и l-> proc? Это указатели? Целые числа? Структуры?

4. Я выполнял -> operator раньше, но я попробовал (* l).proc просто чтобы посмотреть, не затевается ли сумасшествие. current_process и l-> proc являются структурами.

Ответ №1:

Любой здравомыслящий компилятор оптимизировал бы эти два идентичных блока в один блок. Вероятно, это также оптимизирует два условных выражения в одно. Если вы хотите, чтобы оба указателя выполнялись отдельно, добавьте puts("A"); к первому и puts("B"); ко второму.

Комментарии:

1. Я изменил это так, чтобы if(current_process == NULL) находился вне основного оператора if (и, следовательно, выполнялся первым делом), что должно избежать оптимизации компилятора (я думаю). Оно по-прежнему прерывается только при втором отключении.