Подтвердить что ты не робот

Sizeof void pointer

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

4b9b3361

Ответ 1

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

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

Ответ 2

За онлайн-стандарт C (проект n1256):

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

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

Ответ 3

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

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

Ответ 4

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

Ответ 5

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

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