почему sizeof
указатель void 2
?
Sizeof void pointer
Ответ 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
.