Bre*_*ree 9 c c++ memory malloc new-operator
也许这是一个简单的问题但我真的很想知道它.
如果我想在内存中的某个特定地址(堆中)存储一个值,比如一个int,我该怎么做?
说,我想将int值10存储在0x16.我想通过调用new或malloc来做到这一点:int*p = new int(10); 然后我想将存储的值的地址设置为0x16.起初我认为像&p = 0x16这样的东西,但这不起作用.我需要这样做以在内存中的某个值前面存储一些附加信息(之前通过malloc或new分配了内存空间).
我正在使用Linux和C++(但C也可以).
我想要实现的是:一个进程调用大小为x的malloc,我想在分配的内存前面存储一个特定的值(大小),所以我可以稍后访问该大小(调用free时).由于调用了malloc,我知道操作系统为该值分配空间的指针,我只想将指定内存的大小存储在指定内存前面的4个字节中.我所做的(在我编写的malloc钩子中)是分配更多内存(通过内部mallok调用)但我还需要能够在特定位置存储此大小值.
我感谢所有的帮助.
Pau*_*l R 11
你可以这样做:
*(int *)0x16 = 10; // store int value 10 at address 0x16
Run Code Online (Sandbox Code Playgroud)
请注意,这假设地址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;
Run Code Online (Sandbox Code Playgroud)
然后在您的代码中,您可以读取如下的写寄存器:
uint8_t reg1_val = *REG_1; // read value from register 1
*REG_2 = 0xff; // write 0xff to register 2
Run Code Online (Sandbox Code Playgroud)
我认为实现目标的最佳方法是实现自己的malloc,它将分配4个字节并存储内存块的大小,如:
void* mymalloc(int size)
{
char* ptr = malloc(size+sizeof(int));
memcpy(ptr, &size, sizeof(int));
return ptr+sizeof(int);
}
Run Code Online (Sandbox Code Playgroud)