对于安全地使用显式数字作为指针地址,是否有任何类型的最佳做法?我的意思是以下例子:
#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当时没有被其他东西使用而且你不会导致内存损坏?如果你不能假设,是否有任何安全的方法来定义一个地址?
答案 0 :(得分:5)
假设如果你知道它的0x10000那么你也知道什么时候是真的。通常这是硬件(我知道io端口5是0x10000)或低级OS内核(引导映像由内核的另一部分加载到0x10000)。如果你不写这些东西,那你就不应该做硬编码地址
答案 1 :(得分:1)
如果您在Windows下运行,VirtualAlloc
功能允许您指定推荐的基地址。如果请求的区域是免费的,VirtualAlloc
将使用该区域。但是,如果该区域正在使用中,VirtualAlloc
将选择不同的基址。
对于linux(也许是unix),你可以用同样的方式使用mmap
功能 - 在选择不同的地址之前先尝试你的指定地址。