размер пустого указателя - PullRequest
19 голосов
/ 04 октября 2010

почему sizeof пустой указатель 2?

Ответы [ 5 ]

39 голосов
/ 04 октября 2010

Размер void* зависит от платформы.Обычно это значение составляет 4 или 8 байтов для 32- и 64-битных платформ соответственно.Если вы получаете 2 в качестве значения, то, скорее всего, вы работаете на 16-битной платформе кодирования (или, возможно, имеете ошибку кодирования)

Не могли бы вы опубликовать код, который вы используете, и дополнительную информацию о вашей среде / операционной системе?

5 голосов
/ 04 октября 2010

В соответствии со онлайн стандартом C (черновик n1256) :

6.2.5 Типы
...
27 Указатель на void должен иметь те же требования к представлению и выравниванию, что и указатель на тип символа. 39) Аналогично, указатели на квалифицированные или неквалифицированные версии совместимых типов должны иметь те же требования к представлению и выравниванию. Все указатели на типы конструкций должны иметь одинаковые требования к представлению и выравниванию. как друг друга. Все указатели на типы объединения должны иметь одинаковое представление и требования выравнивания как друг друга. Указатели на другие типы не обязательно должны иметь одинаковые требования представления или выравнивания.

Относительно того, почему указатели void и char имеют размер 2 в вашей системе, я подозреваю, что это потому, что вы работаете на 16-битной платформе.

1 голос
/ 04 октября 2010

Указатель хранит адрес памяти, который указывает на что-то еще. Размер указателя зависит от вашей платформы. На 32-битной платформе вам нужно 32 бита или четыре байта для хранения адреса памяти, поэтому размер любого указателя вернет 4.

Если sizeof (void *) равен 2, вы, вероятно, работаете на 16-битной платформе.

0 голосов
/ 17 ноября 2017

Размер указателя равен размеру целого числа. Это может быть 2 байта в 16-битном компиляторе и 4 байта в 32-битном компиляторе и 8 в 64-битном компиляторе.

void *ptr, int *ptr и char *ptr даст вам одинаковый размер, но если вы сделаете ptr++, соответствующий указатель будет перемещаться в соответствии с имеющимися типами данных. т.е. 1 позиция в случае void и char. Аналогично 4 позиции в int случае.

0 голосов
/ 04 октября 2010

Как уже отмечал JaredPar, это зависит от платформы. Другими словами: сколько бит использует используемый процессор для адресации памяти? Для 16-битных адресов вы получите размер 2 байта. Вы компилируете код для 16-битного микроконтроллера?

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