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