//program to print address of variable
#include<stdio.h>
main () {
int a = 10;
printf("%u", &a);
return;
}
当变量的地址以C或任何其他编程语言显示时,该地址是逻辑还是物理请告诉我
答案 0 :(得分:1)
无论您使用哪种地址(用户模式,即操作系统顶部),您的程序实际上都是虚拟/逻辑地址,除非您正在编写内核的一部分或者您正在使用没有虚拟内存支持的操作系统。 例如 - 在集会中
mov eax,[rsi] ; just for example
虚拟到物理的映射是操作系统的工作。
您在程序中使用的地址,即CPU用于获取数据的地址,不是真实的,并且通过MMU转换为某个物理地址;每个人都有一个,其大小取决于您的系统(Linux运行32位有4GB地址空间)
使用地址时,不要忘记将arg转换为printf为void *。
请参阅我的other answer for the standard to use %p specifier for using address in printf
答案 1 :(得分:1)
这是logical
地址。 virtual
保护机制不允许您使用real, physical
地址
请注意,这种情况发生在MMU
环境中普通应用程序的“常见”情况下,假设您的应用程序在user-mode
中运行,而不是在kernel mode
中运行。在MMU-less
机器上,您将获得物理地址;但话说回来,您可能没有对流程的支持,因此您可能无法像上面那样修改main
。
答案 2 :(得分:0)
既不是你的情况:"%p"
是指针类型的适当格式说明符;目前,您的程序的行为是 undefined 。
改为使用printf("%p", (void*)&a);
。
它将是您的C运行时提供的地址,在这个意义上它是逻辑地址。在现代平台上,物理地址与您在代码中看到的抽象层之间有一个(如果不是两个)抽象层次。