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

C: размер void *

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

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

4b9b3361

Ответ 1

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

Вот C FAQ.

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

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

Ответ 2

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

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

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