C++ 安全地使用显式地址分配
关于安全地使用显式数字作为指针地址,是否有任何类型的最佳实践?我指的是下面的例子:C++ 安全地使用显式地址分配,c++,c,C++,C,关于安全地使用显式数字作为指针地址,是否有任何类型的最佳实践?我指的是下面的例子: #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 这可能表明我有些无知
#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处加载)。如果你没有写这些东西,那么你就不应该写硬编码地址。假设你知道它的0x10000,那么你也知道什么时候是真的。通常这是用于硬件(我知道io端口5位于0x10000)或低级操作系统内核(引导映像由内核的另一部分在0x10000处加载)。如果你没有写这些东西,那么你就不应该写硬编码地址。如果你在Windows下运行,
VirtualAlloc
函数允许你指定一个推荐的基址。如果请求的区域是免费的,VirtualAlloc
将使用该区域。但是,如果该区域正在使用,VirtualAlloc
将选择不同的基址
对于linux(可能还有unix),您可以用同样的方法使用
mmap
函数,它会先尝试指定的地址,然后再选择其他地址。如果您在Windows下运行,则VirtualAlloc
函数允许您指定建议的基址。如果请求的区域是免费的,VirtualAlloc
将使用该区域。但是,如果该区域正在使用,VirtualAlloc
将选择不同的基址
对于linux(可能还有unix),您可以以相同的方式使用
mmap
函数-在选择不同的地址之前,它将首先尝试您给定的地址。您可能会遇到一般情况,这不一定安全,当然不推荐。在现代操作系统上,您无法可靠地做到这一点。假设是,如果您知道它的0x10000,那么您也知道该假设何时成立。通常,这是针对硬件(我知道io端口5位于0x1000)或低级别操作系统内核(引导映像由内核的另一部分在0x10000加载)您是否为微控制器或类似设备开发的?这样做可能是安全的唯一方法是使用实现设备驱动程序。通常,您可能会遇到,这不一定是安全的,当然也不推荐。在现代操作系统上,您无法可靠地做到这一点。假设是,如果您知道它的0x10000,那么您也知道该假设何时成立。通常,这是针对硬件(我知道io端口5位于0x1000)或低级操作系统内核(引导映像由内核的另一部分在0x10000处加载)您是否为微控制器或类似设备开发的?唯一安全的方法是使用实现设备驱动程序。将尝试此方法。将尝试此方法。