Программирование >>  Перегруженные имена функций и идентификаторы 

1 ... 175 176 177 [ 178 ] 179 180 181 ... 210


5. Нулевой код ASCII (NUL), в котором все биты равны нулю,но который имеет мало общего с нулевым указателем, разве что названия похожи.

6. Нулевой стринг , или, что то же самое, пустой стринг

( ).

Почему так много путаницы связано с нулевыми указателями? Почему так часто возникают вопросы?

Программисты на Си традиционно хотят знать больше, чем это необходимо для программирования, о внутреннем представлении кода. Тот факт, что внутреннее представление нулевых указателей для большинства машин совпадает с их представлением в исходном тексте, т.е. нулем, способствует появлению неверных обобщений. Использование макроса (NULL) предполагает, что значение может впоследствии измениться, или иметь другое значение для какого-нибудь компьютера. Конструкция if(p == 0) может быть истолкована неверно, как преобразование перед сравнением p к целому типу, а не 0 к типу указателя. Наконец, часто не замечают, что термин null употребляется в разных смыслах (перечисленных выше).

Хороший способ устранить путаницу - вообразить, что язык Си имеет ключевое слово (возможно, nil, как в Паскале), которое обозначает нулевой указатель. Компилятор либо преобразует nil в нулевой указатель нужного типа, либо сообщает об ошибке, когда этого сделать нельзя. На самом деле, ключевое слово для нулевого указателя в Си - это не nil а 0 . Это ключевое слово работает всегда, за исключением случая, когда компилятор воспринимает в неподходящем контексте 0 без указания типа как целое число, равное нулю, вместо того, чтобы сообщить об ошибке. Программа может не работать, если предполагалось, что 0 без явного указания типа - это нулевой указатель.

Я все еще в замешательстве. Мне так и не понятна возня с нулевыми указателями

Следуйте двум простым правилам:

1. Для обозначения в исходном тексте нулевого указателя, используйте 0 или NULL .

2. Если 0 ии NULL используются как фактические аргументы при вызове функции, приведите их к типу указателя, который ожидает вызываемая функция.



Учитывая всю эту путаницу, связанную с нулевыми указателями, не лучше ли просто потребовать, чтобы их внутреннее представление было нулевым?

Если причина только в этом, то поступать так было бы неразумно, так как это неоправданно ограничит конкретную реализацию, которая (без таких ограничений) будет естественным образом представлять нулевые указатели специальными, отличными от нуля значениями, особенно когда эти значения автоматически будут вызывать специальные аппаратные прерывания, связанные с неверным доступом.

Кроме того, что это требование даст на практике? Понимание нулевых указателей не требует знаний о том, нулевое или ненулевое их внутреннее представление. Предположение о том, что внутреннее представление нулевое, не приводит к упрощению кода (за исключением некоторых случаем сомнительного использования calloc. Знание того, что внутреннее представление равно нулю, не упростит вызовы функций, так как размер указателя может быть отличным от размера указателя на int. (Если вместо 0 для обозначения нулевого указателя использовать nil , необходимость в нулевом внутреннем представлении нулевых указателей даже бы не возникла).

Ну а если честно, на какой-нибудь реальной машине используются ненулевые внутренние представления нулевых указателей или разные представления для указателей разных типов?

Серия Prime 50 использует сегмент 07777, смещение 0 дя

нулевого указателя, по крайней мере, для PL/I. Более поздние

модели используют сегмент 0, смещение 0 для нулевых указателей

Си, что делает необходимыми новые инструкции, такие как

TCNP (проверить нулевой указатель Си), которые вводятся для

совместимости с уцелевшими скверно написанными Си

программами, основанными на неверных предположениях.

Старые машины Prime с адресацией слов были печально

знамениты тем, что указатели на байты (char *) у них б1и

большего размера, чем указатели на слова (int *).

Серия Eclipse MV корпорации Data General имеет три аппаратно поддерживаемых типа указателей (указатели на слово, байт и бит), два из которых - char * и void * используются компиляторами Си. Указатель word * используется во всех других случаях.



Некоторые центральные процессоры Honeywell-Bull используют код 06000 для внутреннего представления нулевых указателей.

Серия CDC Cyber 180 использует 48-битные указатели, состоящие из кольца (ring), сегмента и смещения. Большинство пользователей имеют в качестве нулевых указателей код 0xB00000000000.

Символическая Лисп-машина с теговой архитектурой даже не имеет общеупотребительных указателей; она использует пару <NIL,0> (вообще говоря, несуществующий <объект, смещение> хендл) как нулевой указатель Си.

В зависимости от модели памяти, процессоры 80*86 (PC) могут использовать либо 16-битные указатели на данные и 32-битные указатели на функции, либо, наоборот, 32-битные указатели на данные и 16-битные - на функции.

Старые модели HP 3000 используют различные схемы адресации для байтов и для слов. Указатели на char и на void, имеют, следовательно, другое представление, чем указатели на int (на структуры и т.п.), даже если адрес одинаков.

Что означает ошибка во время исполнения null pointer assignment (запись по нулевому адресу). Как мне ее отследить?

Это сообщение появляется только в системе MS-DOS и

означает, что произошла запись либо с помощью

неинициализированного, либо нулевого указателя в нулевую

область.

Отладчик обычно позволяет установить точку останова при доступе к нулевой области. Если это сделать нельзя, вы можете скопировать около 20 байт из области 0 в другую и периодически проверять, не изменились ли эти данные.

Я слышал, что char a[] эквивалентно char *a

Ничего подобного. (То, что вы слышали, касается формальн1х параметров функций.) Массивы - не указатели. Объявление массива char a[6]; требует определенного места для шести символов, которое будет известно под именем a . То есть, существует место под именем a , в которое могут быть помещены 6 символов. С другой стороны, объявление указателя char *p; требует места только для самого указателя. Указатель



1 ... 175 176 177 [ 178 ] 179 180 181 ... 210

© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки.
Яндекс.Метрика