Использование size_t для эмуляции пустого указателя
int bar(const size_t value) {
char *d = (char*) value;
*d = 'B';
}
int main() {
char bar = 'A';
bar((size_t)&d);
}
Использует
size_t
эмулировать недействительный указатель типа законно? Зачем?Какие преимущества / недостатки у него есть?
1 ответ
Решение
Для указателей данных обратный путь от указателя к целочисленным типам обратно к исходному типу указателя хорошо определен, если целочисленный тип достаточно широк, чтобы удерживать указатель без потерь.
size_t
был определен для хранения размера объекта. Они обычно достаточно велики, чтобы содержать представление указателя, но это не гарантируется, и они были реализациями, где предположение не выполнялось.
uintptr_t
а также intptr_t
целочисленные типы, определенные как достаточно широкие, чтобы держать указатель без потерь.
Что касается указателей на функции, я не знаю такой гарантии.