在内存中明确分配或访问特定地址/位置的值?

我的确切问题是cc++中有任何规定明确地将值分配给特定地址,例如假设我想将20存储在内存中的0x1846010地址,并且我还想使用相同的地址( 0x1846010 )访问一个值。

可能很容易但我真的很困惑如何做到这一点,如果我们可以。

任何人都可以解释这是可能的,如果是,那么如何(有适当的例子),如果没有那么为什么?

提前致谢。

你可以这样做:

 *(int *)0x1846010 = 20; // store int value 20 at address 0x1846010 

检索工作类似:

 int x = *(int *)0x1846010; 

请注意,这假设地址0x1846010是可写的 – 在大多数情况下,这将生成一个exception,如Access violation writing location 0x01846010

PS为了您的兴趣,您可以使用以下内容(从此处借用)在运行时检查给定地址是否可写:

 #include  #include  int is_writeable(void *p) { int fd = open("/dev/zero", O_RDONLY); int writeable; if (fd < 0) return -1; /* Should not happen */ writeable = read(fd, p, 1) == 1; close(fd); return writeable; } 

正如这里所讨论的,通常你只会为没有操作系统的嵌入式代码等做这种事情,你需要写入特定的存储单元,如寄存器,I / O端口或特殊类型的存储器(例如NVRAM )。

是。

假设0x1846010是您具有写访问权限的有效地址,您可以编写:

 *(int*)0x1846010 = 20; 

并访问存储的值:

 printf("%d\n", *(int*)0x1846010); 

如果你真的在程序中这样做,它可能会崩溃,因为0x1846010很可能不是你有写访问权的有效地址。

你为什么要这么做? 你怎么知道(如果你知道的话) 0x1846010是一个有效的地址?

这假设整数值0x1846010到指针的转换甚至是有意义的。 转换的结果是实现定义的 ,但“旨在与执行环境的寻址结构一致”。

这取决于您使用的平台和操作系统(如果有)。 通过语言的观点,herohuyongtao的解决方案通常是有效的。 真正的问题是你环境中地址的含义(换句话说:你的目标是什么?)。 如果您使用的是现代操作系统,地址几乎肯定是虚拟的(即由CPU的内存管理单元以透明的方式进行转换)。 如果您的目标是在某个特定的物理单元上写入(即因为它托管设备并且您想要驱动它),则必须首先确保操作系统已为您创建了物理地址视图。 这样做的方式完全取决于操作系统的API。 即使您没有任何操作系统,但您处理的地址仍然可能不是“物理的”。 这取决于CPU及其初始化方式。 一个完全不同的情况是,当您的目标是更改特定地址时,因为“您知道”在您的环境中它具有特定含义。 即,OS可以在已知的虚拟地址处存储一些有用的信息。 许多操作系统用于在固定地址存储环境变量和命令行参数的副本,因此C运行时库可以轻松找到它们。 如果这是你的情况,那么herohuyongtao的建议通常是好的。