Является ли sizeof (size_t) == sizeof (void *) всегда истинным?

Гарантирует ли стандарт C99/С++ 11, что sizeof(size_t) == sizeof(void*) всегда верно?

size_t f(void* p)
{
    return (size_t)(p); // Is it safe?
}

void* f(size_t n)
{
    return (void*)(n); // Is it safe?
}

Ответы

Ответ 1

Нет, это не гарантировано. Используйте intptr_t или uintptr_t для безопасного хранения указателя в целых числах.

Существуют/были архитектуры, где имеет смысл, чтобы это было ложным, например, сегментированная модель памяти DOS. Там память была структурирована в сегментах 64 тыс. - объект никогда не может быть больше сегмента, поэтому будет достаточно 16-бит size_t. Однако указатель имел части "сегмент" и "смещение", поэтому по определению они должны быть больше 16 бит, чтобы иметь возможность ссылаться на разные сегменты.