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

C++ 如何在内存中的特定位置存储值?,c++,c,memory,malloc,new-operator,C++,C,Memory,Malloc,New Operator,也许这是一个简单的问题,但我真的很想确定 如果我想在内存(堆)中的特定地址存储一个值,比如一个int,我该怎么做 比如说,我想将int值10存储在0x16。我想可以通过调用new或malloc:int*p=newint(10);然后我想将存储值的地址设置为0x16。起初,我以为是&p=0x16之类的东西,但这不起作用。我需要这样做,以便在内存中的某个值之前存储一些附加信息(之前由malloc或new分配的内存空间) 我使用Linux和C++(但是C也会工作)。 我想要实现的是:一个进程调用大小为

也许这是一个简单的问题,但我真的很想确定

如果我想在内存(堆)中的特定地址存储一个值,比如一个int,我该怎么做

比如说,我想将int值10存储在0x16。我想可以通过调用new或malloc:int*p=newint(10);然后我想将存储值的地址设置为0x16。起初,我以为是&p=0x16之类的东西,但这不起作用。我需要这样做,以便在内存中的某个值之前存储一些附加信息(之前由malloc或new分配的内存空间)

<>我使用Linux和C++(但是C也会工作)。 我想要实现的是:一个进程调用大小为x的malloc,我想在分配的内存前面存储一个特定的值(大小),这样我以后可以访问该大小(当调用free时)。由于调用了malloc,我知道操作系统为值分配空间的指针,我只想将分配内存的大小存储在分配内存前面的4个字节中。我所做的(在我编写的mallochook中)是分配更多内存(通过内部mallok调用),但我还需要能够将这个大小值存储在特定位置


我感谢所有的帮助

您可以使用

将类型放置在freestore(也称为堆)的特定内存位置。您可以这样做:

*(int *)0x16 = 10;  // store int value 10 at address 0x16
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
请注意,这假设地址0x16是可写的-在大多数情况下,这将生成异常

通常,您只会在没有操作系统且需要写入特定内存位置(如寄存器、I/O端口或特殊类型的内存(如NVRAM))的嵌入式代码等中执行此类操作

您可以这样定义这些特殊地址:

*(int *)0x16 = 10;  // store int value 10 at address 0x16
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
然后,在代码中,您可以读写寄存器,如下所示:

*(int *)0x16 = 10;  // store int value 10 at address 0x16
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

我相信实现目标的最好方法是实现自己的malloc,它将多分配4个字节并存储内存块的大小 比如:

我想要实现的是:一个进程调用大小为x的malloc,我想在分配的内存前面存储一个特定的值(大小),这样我以后可以访问该大小(当调用free时)。由于调用了malloc,我知道操作系统为值分配空间的指针,我只想将分配内存的大小存储在分配内存前面的4个字节中

这是行不通的。只有在法律上,您才允许写入库分配给您的内存地址。在C语言中,这意味着
malloc
及其朋友。在C++中,这也意味着<代码> MalOC (虽然应该避免在C++中)和<代码>新< /COD> < /P> 任何试图写入这些分配方案分配的显式空间之外的内存的行为都会导致未定义的行为。这通常意味着“坏事会发生。”

例如,
malloc
返回的地址前的4个字节可能是堆的一部分。也就是说,
malloc
free
用于执行其工作的数据结构。通过向它们写入,您现在已经损坏了堆;现在,每一次内存分配或释放都充满了危险,可能会以惊人的失败告终


或者,地址前的4个字节可能超出了虚拟地址空间。在这种情况下,操作系统将立即终止您的程序。这就是“一般保护故障”或“分段故障”时发生的情况。好消息是,这通常是即时的,因此您可以在调试器中看到它发生的位置。与堆损坏不同,如果不知道堆的工作原理(或不使用堆调试工具),就无法判断发生了什么问题。

您真的应该阅读一些有关指针的教程,您想要执行的操作是不合法的。除非您了解操作系统和内存分配器(显然您不了解),否则它将崩溃或执行其他意外操作。告诉我们你真正想要实现什么,而不是你认为你需要做的。我会使用
重新解释\u cast
,而不是C风格的cast。值得注意的是,代码的低级别、依赖于机器的特性。某些嵌入式/直接内存系统(驱动程序等)也是如此。但我认为OP并不是在这种情况下——他们似乎对过程记忆的概念感到困惑。因此,我认为这实际上对他们没有帮助(在linux上,你根本做不到)@edA:你可能是对的——最初的问题相当模糊/混乱,但OP似乎随后添加了更多关于他想要实现什么的细节。我不知道为什么我的答案应该被否决。”杰姆斯:这个问题被标记为C和C++,所以我假设这里的最低公分母。保罗,我不是被否决的那个人。从完整的问题来看,我猜他们只是在寻找共享内存。@Bo true。这是一个小例子。实施应该更加复杂