Язык С в вопросах и ответах



             

Язык С в вопросах и ответах - сстр. 6


        Rationale Разд. 4.1.5 c. 74.

1.4:  Как #define должен определять NULL на машинах, использующих
        ненулевой двоичный код для внутреннего представления нулевого
        указателя?

О:    Программистам нет необходимости    знать внутреннее представление(я)
      нулевых     указателей, ведь об этом обычно заботится компилятор.
      Если машина использует ненулевой код для представления нулевых
      указателей, на совести компилятора генерировать      этот код, когда
      программист обозначает нулевой указатель как "0" или NULL.
      Следовательно, определение NULL    как 0 на машине, для которой нулевые
      указатели представляются ненулевыми значениями так же правомерно как
      и на любой другой, так как компилятор должен (и      может) генерировать
      корректные значения нулевых указателей в ответ на 0, встретившийся в
      соответствующем   контексте

1.5   Пусть NULL был определен следующим образом:

            #define     NULL ((char *)0).

      Ознает ли это, что функциям можно передавать NULL без преобразования
      типа?

О:    В общем, нет. Проблема в том, что существуют компьютеры, которые
      используют различные внутренние    представления для указателей на
        различные типы данных. Предложенное определение через #define
      годится, когда функция ожидает в качестве передаваемого    параметра
        указатель на char, но могут возникнуть проблемы при передаче
        указателей на переменные других типов, а верная конструкция

            FILE *fp = NULL;

      может не сработать.

        Тем не менее, ANSI C допускает другое определение для NULL:

            #define NULL ((void *)0)

        Кроме помощи в работе некорректным программам (но только в случае
        машин, где указатели на разные типы имеют одинаковые размеры, так
        что помощь здесь сомнительна) это определение может выявить
        программы, которые неверно используют NULL (например, когда был
        необходим символ ASCII NUL; см.


Содержание  Назад  Вперед