Существует ли наилучшая практика любого типа в отношении безопасного использования явного числа для адреса указателя? Под этим я подразумеваю следующий пример:
#define BASE_ADDRESS 0x10000
typedef struct my_var_list
{
int var1;
int var2;
} my_function_list;
my_var_list *MyVars;
MyVars = BASE_ADDRESS; // Set the address of MyVars to be 0x10000
Это может продемонстрировать некоторое незнание с моей стороны, но как вы можете гарантировать, что 0x10000 не используется кем-то еще в то время, и вы не вызываете повреждение памяти? Если вы не можете предположить, существует ли безопасный способ определения адреса для использования?
предполагается, что если вы ЗНАЕТ его 0x10000, тогда вы также знаете, когда это правда. Обычно это относится к аппаратным средствам (я знаю, что порт io 5 находится в 0x10000) или ядро ОС низкого уровня (загрузочный образ загружается на 0x10000 другой частью ядра). Если вы не пишете ни одну из этих вещей, тогда вы не должны делать жестко закодированные адреса
Если вы работаете под Windows, функция VirtualAlloc
позволяет указать рекомендуемый базовый адрес. Если запрашиваемый регион свободен, VirtualAlloc
будет использовать это. Если, однако, регион используется, VirtualAlloc
выберет другой базовый адрес.
Для linux (и, возможно, unix) вы можете использовать функцию mmap
одинаково - сначала попробуйте ваш адрес, прежде чем выбрать другой.