如何识别Windows操作系统中的RAM地址空间?

时间:2013-11-11 10:09:19

标签: c windows operating-system ram memory-address

如果我创建变量,请说:

int a[10];

我正在创建一个变量,并使用上述变量的地址空间来存储值。那么如何识别上述变量的地址空间?

3 个答案:

答案 0 :(得分:1)

如果要打印变量的地址,请执行

int a[10];
int i;
int *p = &i;
printf("Address of a : %p \n", (void *)a);
printf("Address of i : %p \n", (void *)&i);

//to update i using pointer do
*p = 100; //or even p[0] = 100;


//a is array which is actually a pointer so you can update its elements as
a[0] = 10; //for 1st elem
a[1] = 100; //for 2nd elem etc.
//you can do this too
p = a;
p[0] = 10;
p[1] = 100;

如果您想获得实际的实际地址,则不易获得。

答案 1 :(得分:1)

数组的存储器地址范围从[0]的地址到[9]的地址。您可以使用&a[0]获取起始地址。

Address space是指RAM,io设备等不同硬件组件的地址范围。

答案 2 :(得分:0)

Sachin - 如果您正在为没有虚拟内存的嵌入式系统编写代码,则可以编写字面上的物理地址位置。例如,如果你想写一些8位长的存储器映射寄存器等,地址为0x123,你可以这样做:

*((unsigned char*)0x123) = 45;

它将做的是将值45(十进制)写入物理地址0x123。

意思是:

 *((unsigned char*)0x123)

如下:

(unsigned char*)0x123 // cast value 0x123 to pointer to unsigned char

表示将0x123视为无符号8位值的地址

以及整个事情:

*((unsigned char*)0x123) = 45;

将使用(unsigned char *)0x123获取的指针将值45写入地址0x123。

一般情况下(在嵌入式系统上):

// assuming:
//  C - pointer to 8bit entity
//  S - pointer to 16bit entity
//  I - pointer to 32bit entity
*(C) = 8bit_val;   // will write 8bit **value** to physical address pointed by C
*(S) = 16bit_val;  // will write 16bit **value** to physical address pointed by S
*(I) = 32bit_val;  // will write 32bit **value** to physical address pointed by I

这真的很简单,但这可以做你想要的。 如果要在特定的物理地址上放置数组,结构或常规变量,可以在嵌入式系统上完成(例如,您必须阅读ARM编译器上的分散加载)。 Sccater文件允许您将 a 数组放在您想要的任何位置,并且您可以使用常规语法访问它,而无需明确使用指针。

然而,在Windows平台上,您无法做到这一点,因为您没有使用物理地址,而是使用所谓的虚拟内存,其中您有一些理论上是地址的值,但它与物理地址无关。这太宽泛了,无法解释。这是一个很大的主题。

以下是有关scatter loading

的一些信息