Указатель приведения, который не равен нулю, BOOL возвращает NO - PullRequest
1 голос
/ 06 мая 2011

Недавно я столкнулся с очень редко воспроизводимой ошибкой.Если по какой-то причине я приведу указатель, который не равен нулю, в BOOL, то я получу НЕТ !!! 11 Я знаю, что BOOL - это typedef со знаком char.Может ли это быть проблемой?

Ответы [ 3 ]

4 голосов
/ 06 мая 2011

Если указатель имеет форму 0xNNNNNN00 или (на 64-битной) 0xNNNNNNNNNNNNNN00, где N - любая шестнадцатеричная цифра, то приведение к BOOL (unsigned char) оставит вас с 0, так как он усекает все ненулевые биты.

Чтобы правильно преобразовать указатель в BOOL, используйте оператор неравенства:

BOOL isNotNull = (myPointer != NULL);

4 голосов
/ 06 мая 2011

Это потому, что указатель имеет размер 32 бита, а символ - всего 8 бит.Таким образом, при преобразовании указателя в символ он усекает 24 бита.Таким образом, вероятность того, что оставшиеся 8 битов являются просто нулями, довольно высока, особенно когда адрес указателей высокий.

Что вы можете сделать, это следующее:

BOOL myBool = (myPointer != NULL); // This will evaluate if the pointer is true (>0) or false (NULL)
1 голос
/ 06 мая 2011

BOOL - это не тот тип, который следует использовать, именно по этой причине.На самом деле я могу думать о малой пользе для переменной булевого типа (в отличие от простого использования исходного значения, указателя или чего-либо еще, на чем она основана), за исключением случая с массивами гигантских битов, где вам потребуется специальный код для адресациибиты.Если вы действительно хотите логический тип, используйте C99 _Bool (или bool в stdbool.h), который имеет правильную семантику преобразования, а не сокращение по модулю 256.

...