Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[18.221.112.220] |
|
Страницы: (2) 1 [2] все ( Перейти к последнему сообщению ) |
Сообщ.
#16
,
|
|
|
Цитата Qraizer @ ЫукпШ, это работает ровно до тех пор, пока репрезентация указателей разных типов одинакова. Никто не гарантирует, что так оно и будет везде и всегда. И даже больше: кое-где это не так. Qraizer, да. У микроконтроллеров бывают самые неожиданные варианты адресации. Общего решения нет. Значит, подобные мероприятия в каждом конкретном случае решаются индивидуально. Можно добавить, что подобная операция мало чем отличается от де-сериализации. Есть некая память с содержимым, разбор данных которой целиком выполняется "вручную". Выполняя её мы всю ответственность берём на себя. --- Кроме того, мероприятия с чтением указателя можно сделать более "безопасными". Сначала узнаем размер указателя. sizeof. Сравним его с размером переменной, в которую собираемся его считывать. и.т.д. Или выделим достаточную память для чтения содержимого указателя. В данном случае нам заранее известно, что 64-битной переменной достаточно для приёма любого адреса. |
Сообщ.
#17
,
|
|
|
Цитата ЫукпШ @ делаем #include <stdint.h>. Используем uintptr_t. Все уже придумано до нас. Сначала узнаем размер указателя. sizeof. Сравним его с размером переменной, в которую собираемся его считывать. |
Сообщ.
#18
,
|
|
|
Цитата Dushevny @ делаем #include <stdint.h>. Используем uintptr_t. Все уже придумано до нас. Угу. Но это уже другая тема. Я написал нечто вроде: typedef uintptr_t address_type; Цитата ЫукпШ @ Сначала узнаем размер указателя. sizeof. Сравним его с размером переменной, в которую собираемся его считывать. Я там прописал unsigned long long int... Но на самом деле использовался адаптивный тип address_type, зависящий от размера указателя на платформе. Ну и дополнительно, чтобы проверить совпадает ли размерность, вставил static_assert. |
Сообщ.
#19
,
|
|
|
Цитата Eric-S @ Ну и дополнительно, чтобы проверить совпадает ли размерность, вставил static_assert. Ничего проверять не надо. Как писал Qraizer выше, делаем "union_cast", в котором два поля uintptr_t и uintmax_t. И можем считать указатели) |