C: размер void *
Я немного смущен указателем void * в C. Особенно после прочтения этого вопроса: Является ли sizeof (некоторый указатель) всегда равным четырем?, где один человек говорит, что нет гарантии, что sizeof (int *) == sizeof (double *)
Мой вопрос: есть ли гарантия sizeof (void *) >= sizeof (любой другой тип указателя)?
Другими словами, могу ли я всегда назначать указатель some_type * указателю void *, а затем возвращать его как some_type *?
Ответы
Ответ 1
Только указатели данных. void *
может содержать любой указатель данных, но не указатели на функции.
Вот C FAQ.
void * гарантируется только сохранение указателей объектов (т.е. данных); Это не переносится, чтобы преобразовать указатель на тип void *. (На некоторых машины, адреса функций могут быть очень большими, больше, чем любые данные указатели.)
Что касается первой части, да, разные типы могут иметь указатели разных размеров:
Ответ 2
Значение, сохраненное в указателе, является адресом в памяти. Если вы используете 32-разрядную систему, этот указатель в памяти будет длиной 32 бита (или четыре байта). Если вы используете 64-битную систему, этот указатель в память будет иметь длину 64 бит (или восемь байт).
Размер данных, содержащих местоположение в памяти, не имеет ничего общего с размером данных, представленных в этом месте в памяти.
Что касается того, как char *
отличается от double *
, char *
может указывать на любое местоположение, но double *
должен указывать на что-то вдоль восьмибайтовой границы. Более крупные данные должны быть выровнены в соответствии с правилами вашего процессора. Таким образом, указатели на небольшие данные обычно не совместимы с указателями на большие данные (например, вы не должны указывать указатель double *
на адрес char *
); но вы сохраняете движение в другом направлении (например, вы можете указать указатель char *
на адрес double *
).