Страницы

Поиск по вопросам

среда, 18 декабря 2019 г.

Может ли NULL давать не нулевое значение?

#c #null


При программировании часто использую подобное выражение:

if (pointer) {
    ....
}


что эквивалентно (по крайней мере для моей системы):

if (pointer != NULL)


где pointer указатель. Хочу удостовериться, что этот код не несет в себе опасности
на других системах и т.д. В учебнике нашел только, что NULL возвращает значение не
указывающее ни на какой объект. Но равно ли это значение 0 априори?
    


Ответы

Ответ 1



Также внесу некоторые дополнения к ответам, которые дали @alexolut и @VladD. Как вообще C решает истинно выражение expression в операторе if или нет: if ( expression ) statement if ( expression ) statement else statement ? Пункт 6.8.4.1 / 2 говорит следующее: In both forms, the first substatement is executed if the expression compares unequal to 0. In the else form, the second substatement is executed if the expression compares equal to 0. [...] То есть, выражение expression сравнивается с нулём. Если оно не равно нулю, то выражение expression считается истинным, если оно равно нулю, то expression считается ложным. Таким образом, примеры в вашем вопросе интерпретируются так: if ( pointer != 0 ) if ( (pointer != NULL) != 0 ) В стандарте языка явно оговорено (6.3.2.3 / 3), что и 0, и (void *)0, и NULL — нулевые указательные константы (null pointer constant). Для целей сравнения указателя и нулевой указательной константы, нулевая указательная константа преобразуется к типу указателя (6.5.9 / 5): [...] If one operand is a pointer and the other is a null pointer constant, the null pointer constant is converted to the type of the pointer. [...] Результат такого преобразования — нулевой указатель (null pointer). Если pointer не является нулевым указателем, то согласно пункту 6.5.9 / 6, оба выражения: pointer != 0 и pointer != NULL — истинны. Некоторого пояснения заслуживает выражение (pointer != NULL) != 0. Относительно операторов != и == стандарт языка говорит следующее (6.5.9 / 3): [...] Each of the operators yields 1 if the specified relation is true and 0 if it is false. The result has type int. [...] Таким образом, если pointer — не является нулевым указателем, то выражение (pointer != NULL) — равно 1, а значит выражение (pointer != NULL) != 0 истинно.

Ответ 2



В дополнение к ответу @alexolut отмечу, что битовое представление нулевого указателя не обязательно состоит из всех нулевых битов. Тем не менее, даже при таком представлении выражение (void*)0 должно давать нулевой указатель (то есть, приведение типов должно менять внутреннее представление), а также сравнение с нулём (if (p == 0)) и проверка if (p) должны работать ожидаемым образом.

Ответ 3



Из стандарта языка С11, 6.3.2.3/3: An integer constant expression with the value 0, or such an expression cast to type void *, is called a null pointer constant. Таким образом проверка на 0 эквивалентна проверке на NULL.

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

Отправить комментарий