Использование size_t для эмуляции пустого указателя

int bar(const size_t value) {
  char *d = (char*) value; 
  *d = 'B';
}

int main() {
    char bar = 'A';
    bar((size_t)&d);
}
  1. Использует size_t эмулировать недействительный указатель типа законно? Зачем?

  2. Какие преимущества / недостатки у него есть?

1 ответ

Решение

Для указателей данных обратный путь от указателя к целочисленным типам обратно к исходному типу указателя хорошо определен, если целочисленный тип достаточно широк, чтобы удерживать указатель без потерь.

size_t был определен для хранения размера объекта. Они обычно достаточно велики, чтобы содержать представление указателя, но это не гарантируется, и они были реализациями, где предположение не выполнялось.

uintptr_t а также intptr_t целочисленные типы, определенные как достаточно широкие, чтобы держать указатель без потерь.

Что касается указателей на функции, я не знаю такой гарантии.

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