В C++ возможно ли создать массив определенного размера (например, короткий массив [2048]), который начинается с определенного адреса, например 0x1000?Создать массив, начинающийся с определенного адреса
ответ
Короткий ответ: Нет В не-встроенных системах (для которых я ограничу мой ответ) адрес пользовательского пространством является виртуального адресного пространства. Это означает, что даже если вы получаете указатель, который указывает на 0x1000, то есть не физическое местоположение ваших выделенных данных на карте физической памяти. Итак, поскольку система скрывает от вас физические адреса - вы не можете запросить конкретный физический адрес. Виртуальные адреса однако, adiffernet история ...
Поняв, что нет никакой гарантии, что указывает на 0x1000 будет на самом деле означает, что вы направляете на физический адрес 0x1000, в Linux вы можете использовать функцию mmap()
и ее Проводник Windows VirtualAlloc()
, чтобы запросить выделение на конкретный виртуальный адрес. Конечно, эти функции не гарантированно работают (например, если запрашиваемый вами виртуальный адрес уже отображен или если он «зарезервирован системой»).
Во встроенной системе вы можете использовать файл компоновщика для сопоставления символа или специального сегмента. Или, возможно, прагма. Это довольно распространенная проблема для встроенных систем, где загрузчику требуется пространство общей памяти с запущенным приложением, или сопроцессор имеет банк общей памяти с основным процессором по фиксированному адресу. Проблема в том, что метод варьируется от инструмента к инструменту.
Если вам нужен массив точно так же, как на определенном адресе, вы можете поместить его в структуру, из которой вы можете назначить указатель, указывающий на нужное место. Смотрите этот пример:
struct A {
short array[2048];
};
int main(char argc, char** argv) {
A* a = (A*)0x1000;
printf("%p\n", &a->array[0]);
return 0;
}
Это не «создает» (выделяет) массив. Он просто читает содержимое в адресе 0x1000. Это не то, что запросил ОП. – eladidan
Я не согласен с вашей интерпретацией намерений OP. – rasmusb
@eladidan: Я не могу полностью согласиться с вашим комментарием. Во встроенных системах, таких как микроконтроллеры, вы получаете доступ к таким вещам, как выводы ввода/вывода и специальные регистры функций таким образом, как это, где вы разыскиваете жестко указательные указатели. В лучшем случае намерения OP неясны. –
Это возможно с помощью размещения нового:
struct A { short array[2048]; };
char *addr = (char*)0x1000;
new (addr) A;
Если вы хотите динамического размера, используйте следующее:
new (addr) short[size];
не размещает новую работу только в том случае, если адрес был выделен раньше? – eladidan
- 1. Суффикс-массив, начинающийся с scala
- 2. Как создать файл, начинающийся с определенного сектора на диске?
- 3. Индекс наименьшего числа, начинающийся с определенного индекса
- 4. Поиск java.util.List, начинающийся с определенного индекса
- 5. tt_news - Запустить плагин, начинающийся с определенного идентификатора
- 6. int ключ, начинающийся с определенного значения
- 7. создать объект, начинающийся с цифры
- 8. Как создать массив определенного объекта?
- 9. Получить массив, начинающийся со смещения
- 10. JSON массив, начинающийся с бит 1
- 11. Как играть в альбом, начинающийся с определенного трека?
- 12. Как вернуть поплавок, начинающийся с определенного индекса в строке?
- 13. Как создать пользовательский заголовок, начинающийся с underscore
- 14. SQL Server: создать логин, начинающийся с цифр
- 15. Сопоставьте блок строк, начинающийся с определенного charecter в python
- 16. Wix Installer: Открыть файл, начинающийся с определенного префикса (WixShellExecTarget)
- 17. Modsecurity создать файл конфигурации с правилами для определенного URL-адреса
- 18. Как создать массив определенного типа в python
- 19. Как создать массив объектов определенного типа класса
- 20. Как перенаправить адрес, начинающийся с #!
- 21. вызов определенного URL-адреса с rspec
- 22. Ruby array, начинающийся с 1
- 23. Проверка определенного URL-адреса
- 24. Как создать объект или массив, который начнется с определенного номера?
- 25. , начинающийся с скриптов python
- 26. Текст ввода, начинающийся с «#»
- 27. typedef CFString, начинающийся с __
- 28. найти номер, начинающийся с
- 29. jQuery - removeClass, начинающийся с
- 30. git-tfs, начинающийся с git
Как знать конкретный адрес? Это что-то исправлено? Или что-то вроде этого: 'void * address = malloc (size);'? – Nawaz
Это дано. Например, 0x1000. –
Существует не стандартный способ сделать это. Однако ваша платформа/компилятор может предложить нестандартный механизм для этого. Если вы отредактируете свой вопрос, чтобы включить подробную информацию о своей платформе, вы можете получить лучший ответ;) –