В общем случае размер указателя разных типов в некоторых системах может быть разным, если разные типы по-разному адресуются. Например, 8-битный указатель портов и 16-битный указатель данных. Или быстрый 16-битный внутрисегментный указатель и медленный 32-х битный указатель сегмент-смещение.
нет такого. если хочешь хранить указатель в целочисленной переменной, используй (u)intptr_t. но то, что sizeof(void *) == sizeof(intptr_t) стандарт не гарантирует.
Э... libc, это, как бы, очень конкретная библиотека для вполне конкретных архитектур :)
компилятором?
Вот, как раз, в некоторых хитрых платформах у Си-компилятора и есть такие извращения. На x86/ARM/DEC/68K/etc мир не заканчивается ;) Впрочем, вариант со смешанными far* near* указателями и на x86 был.
> идиоты, на Си надо писать под конкретную платформу, это слишком низкоуровневый язык, для кроссплатформенности
Торвальдс с удивлением смотрит на анонимуса
Вообще, конечно, да. По определению там '>=', но задачи, где будет нужно точное соответствие (равно как и архитектуры, где это будет не так), я придумать не могу.
о том, что любое валидное значение указателя на void может быть представлено intptr_t. там нет ни слова о внутреннем представлении ни указателя на void, ни intptr_t.
> Или месье предлагает однозначность преобразования void * => intptr_t и обратно при sizeof(intptr_t) < sizeof(void *)?
а что смущает? что для некоторой платформы указатель может содержать избыточную информацию?
> 8086? Внутрисегментная и межсегментная адресация?
лолшто? у меня случился SIGSEGV, бэктрейс: bk_> 8086? Внутрисегментная и межсегментная адресация? arsi>> x86. bk_>>> Приведи пример такой архитектуры, пожалуйста. arsi>>>> нет, если _anything_* указатель на данные, _anyother_* — на функцию. bk_>>>>> sizeof(_anything_ *) == sizeof(_anyother_ *) arsi>>>>>> sizeof(void *) == sizeof(char *), всегда. bk_>>>>>>> чему _всегда_ равно sizeof(void *) == sizeof(????) ?
> В каких таких случаях указатель на функцию больше указателя на переменную?
я уже не помню точно, как назывались эти модели распределения памяти… medium, compact или как-то так… были near(16bit) code + far(32bit) data и far code + near data… ну и остальные, где указатель на код занимал столько же, как указатель на данные. +pseudo-linear (huge model), но это уже совершенно другая история.
первое, с чего нужно начинать, это читать про размеры типов на конкретной платформе. нет, конечное есть абстракции типа int32_t явно обозначающие размерность типа, но как бы то ни было, всегда есть особенности конкретного компилятора на конкретной платформе.