如何将值存储在内存中的特定位置?

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)


Ole*_*leg 8

我认为实现目标的最佳方法是实现自己的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)


Alo*_*ave 0

您可以使用Placement New将类型放置在 freestore(也称为堆)上的特定内存位置。