Неверное чтение при использовании побитового или

Я случайно написал

if (var < 0 | List == NULL) {
   ...
}

где var является int и перечислить int* (массив целых).

Я хотел написать

if (var < 0 || List == NULL) {
   ...
} 

я знаю это

Операторы |, & и ~ действуют на отдельные биты параллельно. Их можно использовать только для целочисленных типов. а | b выполняет независимую операцию ИЛИ для каждого бита a с соответствующим битом b, чтобы сгенерировать этот бит результата.

Цитата отсюда.

Я не понимаю, что это Valgrind (с опцией --leak-check=full) дал мне ошибку Invalid read of size 8 в первом случае и без ошибок во втором случае.

Я думаю, что доступ к данным var а также List это то же самое в обоих случаях.

Какой тип является результатом List == NULL?

1 ответ

Решение

"Я думаю, что доступ к данным var а также List в обоих случаях одно и то же ".

Нет, разница в оценке короткого замыкания. С логическим ИЛИ, выражение List == NULL не будет оцениваться, когда var < 0,

Но с побитовым ИЛИ, вы будете оценивать List == NULL даже когда var < 0, Почему это вызывает "Недопустимое чтение размера 8", трудно сказать, потому что вы не показали достаточно кода. Но я подозреваю, что List не инициализируется, когда var < 0,

Другие вопросы по тегам