Неверное чтение при использовании побитового или
Я случайно написал
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
,