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

时间:2014-01-22 16:32:19

标签: c++ c memory

我的确切问题是,cc++中有任何条款明确指定特定地址的值,例如假设我要将20存储在0x1846010内存中的地址,我也想使用相同的地址(0x1846010)访问一个值。

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

任何人都可以解释是否可能,如果是,那么如何(有合适的​​例子),如果不是,为什么呢?

提前致谢。

3 个答案:

答案 0 :(得分:7)

你可以这样做:

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

检索类似的作品:

int x = *(int *)0x1846010;

请注意,这假设地址0x1846010是可写的 - 在大多数情况下,这会产生类似Access violation writing location 0x01846010的异常。

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

#include <fcntl.h>
#include <unistd.h>

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;
}

正如here所讨论的那样,对于没有操作系统且需要写入特定内存位置(如寄存器,I / O端口或特殊类型)的嵌入式代码等,通常只会执行此类操作。记忆(例如NVRAM)。

答案 1 :(得分:1)

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

*(int*)0x1846010 = 20;

并访问存储的值:

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

如果您在程序中实际执行此操作,它可能会崩溃,因为0x1846010很可能不是您有写入权限的有效地址。

为什么要这么做?您如何知道(如果您知道)0x1846010是有效地址?

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

答案 2 :(得分:1)

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