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 * адрес).

Другие вопросы по тегам