Сопоставьте адрес памяти с переменной [дубликат]
Как сопоставить адрес памяти с переменной, чтобы создать структуру в этом месте памяти? Я пробовал следующий фрагмент кода для создания структуры по заданному адресу памяти, но он просто сбрасывает ошибку сегментации?
Ячейка памяти в коде - это область ввода, где мне нужно установить определенные данные и позвонить в дверной звонок с кодом операции, чтобы ЦП забирал входные данные и делал то, что код операции говорит, что он делает с данными в области ввода.
some_struct* some_struct_obj= (some_struct*)0xc321000000;
memset(some_struct_obj, 0x00, sizeof(some_struct));
Ответы
Сопоставьте адрес памяти с переменной
В C ++ нет возможности выбрать точное местоположение какой-либо переменной. Вы можете выбрать только класс хранения: автоматический, статический или локальный поток. Реализация языка выбирает адрес.
Как мне сопоставить адрес памяти с ... для создания структуры в этом месте памяти?
Можно создать объект с динамической памятью (которая не является переменной) по любому адресу памяти, если эта память выделена и не содержит нетривиальных объектов. Этого можно добиться с помощью выражения размещения new или некоторых стандартных функций, выполняющих внутреннее размещение new.
В стандартном C ++ нет способа выделить память с произвольного адреса. Реализация языка заботится о выделении памяти для переменных и динамических объектов.
Во встроенных системах без виртуальной памяти реализация языка может задокументировать определенные диапазоны адресов памяти как выделенные. В таком случае вы можете просто использовать новое размещение для создания объектов в этой памяти. Использование таких адресов не будет переносимым в другие системы.
Как насчет нестандартного способа? Да, может быть. Например, стандарт POSIX определяет mmap
функцию:
pa=mmap(addr, len, prot, flags, fildes, off);
Параметр
flags
предоставляет другую информацию об обработке сопоставленных данных. Значением флагов является побитовое ИЛИ этих параметров, определенное в <sys / mman.h>:Symbolic Constant Description MAP_SHARED Changes are shared. MAP_PRIVATE Changes are private. MAP_FIXED Interpret addr exactly.
Когда
MAP_FIXED
установлено в аргументе flags, реализация информируется о том, что значение pa должно бытьaddr
точно.
Однако обратите внимание на следующие справочные страницы Linux:
Единственное безопасное использование
MAP_FIXED
- это когда диапазон адресов, указанный с помощьюaddr
и длина, ранее был зарезервирован с использованием другого сопоставления; в противном случае использованиеMAP_FIXED
может быть опасным, поскольку оно принудительно удаляет существующие сопоставления, что упрощает многопоточному процессу повреждение собственного адресного пространства.