怎样分配一段已知首地址的空间,该如何处理

怎样分配一段已知首地址的空间
在C、C++中怎样去分配一段地址空间,这段地址空间的首地址是已知的,比如0x22223333   ?

------解决方案--------------------
是啊,虽然你可以用如*(unsigned int *)0x123=123456789;的语句对内存赋值,但因为没有申请这块内存会报错。就是因为你没法知道哪些内存是已经被使用的,只能是系统来分配。
------解决方案--------------------
巧得很,C++标准给出了这样一个实现,称为new-placement。主要为了满足一些特定应用的需求,如嵌入式系统等。具体做法很简单:
Something* p = new (0x22223333) Something();
只需在new的后面加(),()里面包含指定的地址即可。
相应的也有数组版本,以及delete。
详见C++标准18.4.1.3 Placement forms一节。
------解决方案--------------------
调用系统级别的api吧
windows参考一下virtualalloc。
楼上的楼上的楼上说的placement new方法不可行,说不定运行期就蹦出个什么错误出来了,因为placement new只是返回指针,并未在系统中加以记载,所以这块内存很可能随后被系统分配为其他用途。
------解决方案--------------------
注意,placement-new是有条件的。如果你在windows上做这个事情,忘了placement new。因为,windows不允许你直接选定内存的位置(比如0x0010000)。这和c++没关系。
placement new通常用在特定的系统中,特定的环境下使用。比如在一个mpu里,某个对象必须放在一个特定的地址位置。
如果在windows之类的操作系统进行高级编程,那么placement new通常用于特殊的内存管理机制。比如,在一个内存管理器中,首先分配一大块内存,然后一小片一小片地分配给客户。此时,便可以使用placement new。此时,new所做的不是内存分配了,而是仅仅起到了一个构造函数调用者的作用。这种技术在有些stl的优化的allocator中使用。
至于virtualalloc也无法让你选定一个地址进行分配。它在reserve时返回的地址依然是由系统决定的。而commit时所使用的地址参数必须在reserve范围内。
在windows中使用new(0x...)这样的语句并不是每次都回出问题,这取决于你0x...的值。如果这个值指向一个当前进程无法访问的位置,如0x00001000,那么就会有一个常规保护错。如果这个值恰巧指向一个可访问的地址,比如说当前进程可访问的某个数据块,那么不会立刻有什么错,误。这在通常情况下当然不好,因为这种访问可能不是合理的。
最后需要说明的是,在windows下,没有合法取得的内存地址(不是new或者正规分配所得,或者在栈上分配),有时也是可以访问,而不会立刻引发什么(甚至永远不会)。但是这种访问可能会引发不可预测的错误,特别是数据上的错误。所以windows上经常有未被发现的越界访问。