c: размер пустоты * - PullRequest
       9

c: размер пустоты *

23 голосов
/ 02 августа 2011

Я немного запутался с указателем void * на C. Особенно после прочтения этого вопроса: Всегда ли sizeof (некоторый указатель) равен четырем? , где один человек говорит, что нет гарантии это sizeof (int *) == sizeof (double *)

Мой вопрос: есть ли гарантия sizeof (void *)> = sizeof (любой другой тип указателя)? Другими словами, могу ли я всегда назначать указатель some_type * указателю void *, а затем возвращать его как some_type *?

Ответы [ 2 ]

27 голосов
/ 02 августа 2011

Только указатели данных. void * может содержать любой указатель данных, но не указатели функций.

Вот C FAQ .

void * гарантированно содержит только указатели на объект (т.е. данные); Это не является переносимым для преобразования указателя функции в тип void *. (На некоторых машины, адреса функций могут быть очень большими, больше, чем любые данные указатели.)

Что касается первой части, да, разные типы могут иметь указатели разных размеров :

10 голосов
/ 02 августа 2011

Значение, хранящееся в указателе, является адресом памяти. Если вы работаете в 32-битной системе, этот указатель в память будет иметь длину 32 бита (или четыре байта). Если вы работаете в 64-битной системе, этот указатель в память будет иметь длину 64 бита (или восемь байтов).

Размер данных, содержащих местоположение в памяти, не имеет ничего общего с размером данных, представленных в этом месте в памяти.

Что касается char *, отличного от double *, char * может указывать на любое местоположение, но double * должен указывать на что-то вдоль восьмибайтовой границы. Большие данные должны быть выровнены в соответствии с правилами процессора, на котором вы работаете. Таким образом, указатели на небольшие данные, как правило, не совместимы с указателями на большие данные (например, вы не должны указывать double * указатель на char * адрес); но вы сохраняете путь в другом направлении (например, вы можете указать char * указатель на double * адрес).

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