2013-02-16 2 views
0

В C++ возможно ли создать массив определенного размера (например, короткий массив [2048]), который начинается с определенного адреса, например 0x1000?Создать массив, начинающийся с определенного адреса

+0

Как знать конкретный адрес? Это что-то исправлено? Или что-то вроде этого: 'void * address = malloc (size);'? – Nawaz

+0

Это дано. Например, 0x1000. –

+0

Существует не стандартный способ сделать это. Однако ваша платформа/компилятор может предложить нестандартный механизм для этого. Если вы отредактируете свой вопрос, чтобы включить подробную информацию о своей платформе, вы можете получить лучший ответ;) –

ответ

0

Короткий ответ: Нет В не-встроенных системах (для которых я ограничу мой ответ) адрес пользовательского пространством является виртуального адресного пространства. Это означает, что даже если вы получаете указатель, который указывает на 0x1000, то есть не физическое местоположение ваших выделенных данных на карте физической памяти. Итак, поскольку система скрывает от вас физические адреса - вы не можете запросить конкретный физический адрес. Виртуальные адреса однако, adiffernet история ...

Поняв, что нет никакой гарантии, что указывает на 0x1000 будет на самом деле означает, что вы направляете на физический адрес 0x1000, в Linux вы можете использовать функцию mmap() и ее Проводник Windows VirtualAlloc(), чтобы запросить выделение на конкретный виртуальный адрес. Конечно, эти функции не гарантированно работают (например, если запрашиваемый вами виртуальный адрес уже отображен или если он «зарезервирован системой»).

1

Во встроенной системе вы можете использовать файл компоновщика для сопоставления символа или специального сегмента. Или, возможно, прагма. Это довольно распространенная проблема для встроенных систем, где загрузчику требуется пространство общей памяти с запущенным приложением, или сопроцессор имеет банк общей памяти с основным процессором по фиксированному адресу. Проблема в том, что метод варьируется от инструмента к инструменту.

-1

Если вам нужен массив точно так же, как на определенном адресе, вы можете поместить его в структуру, из которой вы можете назначить указатель, указывающий на нужное место. Смотрите этот пример:

struct A { 
    short array[2048]; 
}; 

int main(char argc, char** argv) { 
    A* a = (A*)0x1000; 
    printf("%p\n", &a->array[0]); 
    return 0; 
} 
+0

Это не «создает» (выделяет) массив. Он просто читает содержимое в адресе 0x1000. Это не то, что запросил ОП. – eladidan

+0

Я не согласен с вашей интерпретацией намерений OP. – rasmusb

+0

@eladidan: Я не могу полностью согласиться с вашим комментарием. Во встроенных системах, таких как микроконтроллеры, вы получаете доступ к таким вещам, как выводы ввода/вывода и специальные регистры функций таким образом, как это, где вы разыскиваете жестко указательные указатели. В лучшем случае намерения OP неясны. –

0

Это возможно с помощью размещения нового:

struct A { short array[2048]; }; 
char *addr = (char*)0x1000; 
new (addr) A; 

Если вы хотите динамического размера, используйте следующее:

new (addr) short[size]; 
+0

не размещает новую работу только в том случае, если адрес был выделен раньше? – eladidan

Смежные вопросы