Подробности реализации указателя в C - PullRequest
16 голосов
/ 30 августа 2009

Я хотел бы знать архитектуры, которые нарушают предположения Я перечислил ниже. Кроме того, я хотел бы знать, является ли какое-либо из предположений ложным для всех архитектур (то есть, если какое-либо из них просто совершенно неверно).

  1. sizeof (int *) == sizeof (char *) == sizeof (void *) == sizeof (func_ptr *)

  2. Представление в памяти всех указателей для данной архитектуры одинаково независимо от типа данных, на который указывает.

  3. Представление указателя в памяти совпадает с целым числом той же длины в битах, что и архитектура.

  4. Умножение и деление типов данных указателя запрещено только компилятором. ПРИМЕЧАНИЕ: Да, я знаю, что это бессмысленно. Я имею в виду, есть ли аппаратная поддержка, запрещающая такое неправильное использование?

  5. Все значения указателя могут быть приведены к единственному целому числу. Другими словами, какие архитектуры все еще используют сегменты и смещения?

  6. Увеличение указателя эквивалентно добавлению sizeof(the pointed data type) к адресу памяти, сохраненному указателем. Если p является int32*, тогда p+1 равен адресу памяти через 4 байта после p.

Я больше всего привык к указателям, которые используются в непрерывном виртуальном пространстве памяти. Для такого использования я обычно могу считать их адресами в числовой строке. См. Вопрос переполнения стека Сравнение указателей .

Ответы [ 11 ]

0 голосов
/ 16 марта 2010

РЕДАКТИРОВАТЬ: Не отвечайте на вопросы, когда у вас низкий уровень сахара в крови. Ваш мозг (конечно, мой) не работает, как вы ожидаете. :-(

Незначительный придурок:

p - это int32 *, тогда p + 1

неверно, он должен быть без знака int32, иначе он будет обернут в 2 ГБ.

Интересная странность - я получил это от автора компилятора C для чипа Transputer - он сказал мне, что для этого компилятора NULL был определен как -2 ГБ. Зачем? Потому что у Transputer был диапазон адресов со знаком: от -2 ГБ до + 2 ГБ. Вы можете в это поверить? Удивительно, не правда ли?

С тех пор я встречал разных людей, которые говорили мне, что определение NULL как этот не работает. Я согласен, но если вы этого не сделаете, указатели NULL окажутся в середине диапазона адресов.

Я думаю, что большинство из нас может радоваться, что мы не работаем над Transputers!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...