Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/62.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 现代x64系统上的指针内部是什么?_C_Windows_64 Bit - Fatal编程技术网

C 现代x64系统上的指针内部是什么?

C 现代x64系统上的指针内部是什么?,c,windows,64-bit,C,Windows,64 Bit,此代码例如: int x = 75; int *p = &x; printf("%llx\n",p); 写入64位数字。我想问的是,这个数字到底是多少?是的,这是一个地址 但它是虚拟内存中存储值75的绝对地址吗?或者它可能是从某个页面标记偏移,或者是从程序内存块的“起点”偏移 如果有关系的话,我要问的是Windows 10,64位,在一个典型的x64英特尔芯片上。是的,它是您程序的绝对地址 这不是一个补偿 在16位窗口(30年前很常见)中,使用了a,指针被分段,由

此代码例如:

int x = 75;
int *p = &x;

printf("%llx\n",p);
写入64位数字。我想问的是,这个数字到底是多少?是的,这是一个地址

但它是虚拟内存中存储值75的绝对地址吗?或者它可能是从某个页面标记偏移,或者是从程序内存块的“起点”偏移


如果有关系的话,我要问的是Windows 10,64位,在一个典型的x64英特尔芯片上。

是的,它是您程序的绝对地址

这不是一个补偿

在16位窗口(30年前很常见)中,使用了a,指针被分段,由16位分段指针和16位偏移量(总共32位)组成


但是,32位和64位Windows都使用a,它使用绝对地址。

它是一个虚拟地址,是一个虚拟页码和从页面开始的偏移量。翻译机制在进程的页表中查找,以确定相应的物理页码,并将其与偏移量相结合,得出物理地址。

您说的是“您的程序的虚拟地址空间”。这是否意味着另一个程序中的相同64位可以指向物理内存中的另一个地址?或者它对于特定的物理位置是全局唯一的?@CaptainCodeman实际上可以保证另一个程序中的相同64位指向物理内存中的另一个地址(如果它指向任何东西的话)。那么ReadProcessMemory是如何工作的呢?你给它一个虚拟地址;这是否意味着它基于目标进程的地址空间?@WillihamTotland:原则上,你是对的。但是,某些系统dll,例如
kernel32.dll
,在每个进程中始终映射到相同的虚拟地址。此外,也不能保证每个虚拟地址都映射到一个物理地址。即使有效的虚拟地址也不必映射到物理地址。例如,虚拟地址的内容可以存储到磁盘,这样它甚至不存在于内存中。@CaptainCodeman:是的,在调用
ReadProcessMemory
时,还必须指定目标进程。您传递给该函数的地址适用于目标进程的虚拟地址空间。是的,在将虚拟地址转换为物理地址时,使用页表是正确的,并且为了进行此转换,虚拟内存地址分为两部分:1。一个索引进入页面表和2。页偏移量。但是,只有操作系统(维护页表)必须了解此技术细节。对于一个普通的程序员来说,这是不相关的(除非您正在编写内核驱动程序)。普通程序员通常只看到并关心进程的平面虚拟地址空间。