也许这是一个容易的问题,但我真的很想知道它.
如果我想在内存(堆中)的特定地址上存储一个值int(int),该怎么做?
说,我想将int值10存储在0x16.我猜通过调用new或者malloc这样做:int * p = new int(10);然后我想将存储的值的地址设置为0x16.起初我以为只是像& p = 0x16,但是这不行.我需要这样做才能在内存中存储一些额外的信息(以前由malloc或new分配的内存空间).
我正在使用linux和C(但是C也会工作).
我想要实现的是:一个进程调用大小为x的malloc,并且我想在分配的内存前面存储一定的值(大小),所以我稍后可以访问大小(当调用空闲时).由于malloc被调用,所以我知道操作系统为这个值分配了空间的指针,而我只想将分配的内存的大小存储在分配的内存前面的4个字节中.我所做的(在我写的malloc钩子中)是分配更多的内存(通过内部mallok调用),但是我也需要能够将这个大小的值存储在特定的位置.
我很感谢所有的帮助.
解决方法
你可以这样做:
*(int *)0x16 = 10; // store int value 10 at address 0x16
请注意,这假设地址0x16是可写的 – 在大多数情况下,这将产生异常.
通常,您只会在没有操作系统的情况下为嵌入式代码等做这些事情,您需要写入特定的内存位置,例如寄存器,I / O端口或特殊类型的存储器(例如NVRAM).
您可以定义这些特殊地址:
volatile uint8_t * const REG_1 = (uint8_t *) 0x1000; volatile uint8_t * const REG_2 = (uint8_t *) 0x1001; volatile uint8_t * const REG_3 = (uint8_t *) 0x1002; volatile uint8_t * const REG_4 = (uint8_t *) 0x1003;
然后在你的代码中,你可以这样读写寄存器:
uint8_t reg1_val = *REG_1; // read value from register 1 *REG_2 = 0xff; // write 0xff to register 2