Стандарт C говорит следующее: C11 6.3.2.3/6:
Любой тип указателя может быть преобразован в целочисленный тип.За исключением случаев, указанных ранее, результат определяется реализацией.Если результат не может быть представлен в целочисленном типе, поведение не определено.Результат не обязательно должен находиться в диапазоне значений любого целочисленного типа.
Это означает, что от компилятора зависит, что произойдет в данной системе.Очевидно, ваш конкретный компилятор считает, что результат не может быть представлен, и поэтому выдает диагностическое сообщение.
Вместо этого вы должны привести к uintptr_t
.Этот тип гарантированно будет достаточно большим, чтобы содержать значение указателя объекта.