这是我编写的一个小程序,用于打印存储在内存位置(0x7fffdf222fec)的值。 error as 4:20: error: invalid type argument of unary ‘*’ (have ‘long int’ printf("\n %p ",*(0x7fffdf222fec));
我在Ubuntu 16.04中使用gcc编译器,我的ram是4 GB。我不能使用这种方式在此位置访问值吗?
#include<stdio.h>
void main(){
printf("\n %p ",*(0x7ffeae3b3674));
}
Run Code Online (Sandbox Code Playgroud)
预期结果是存储在地址中的垃圾值
我写了一个这样的程序,得到了as的地址
#include<stdio.h>
void main(){
int a;
printf("%p",&a);
}
Run Code Online (Sandbox Code Playgroud)
0x7ffeae3b3674
然后,我将上述地址应用于第一个程序。
更改*(0x7fffdf222fec)为*(int*)0x7fffdf222fec。
0x7fffdf222fec是type的常量long int。您不能取消引用非指针类型,因此需要首先将其强制转换为指针。选择哪个指针取决于您要如何解释该地址上的数据。我int*为这个示例选择了,但是您可以选择除之外的任何指针类型void*。
请注意,尽管这样很可能会出现段错误。除非您确定自己有权访问该位置,否则请不要这样做。
澄清:
我不能使用这种方式在此位置访问值吗?
好吧,这取决于您的意思。这是读取该特定位置的正确方法。问题是您可能无法访问它。
通常情况下,您无法访问访问控制。分段错误基本上是一种操作系统的方式,它告诉您您做得很顽皮。
您可以在此处阅读有关分段错误的更多信息
访问内存的任意部分非常复杂,并且严重依赖系统。在Unix机器上,它的执行方式与在Windows机器上不同。
还请记住,大多数现代操作系统都利用虚拟内存,因此您要读取的地址不是物理地址。操作系统将虚拟地址映射到物理地址。在这里阅读更多
我写了一个这样的程序,得到了as的地址
您不能保证每次运行程序都获得相同的地址。如果声明了变量,则显然可以访问它。尝试多次运行该程序。您每次获得不同地址的可能性很高。
除非您有非常特定的需求,例如编码驱动程序,内核或嵌入式系统,否则您永远不必担心绝对地址。
我很想搜索一个有关从给定地址读取值的重复问题。
这仅需要您将该纯地址值转换为指针。
像这样的东西:
int *p = (int *)0x1000000;
printf("value=%d", *p);
Run Code Online (Sandbox Code Playgroud)
但你的问题有点不同。
通常,给定地址用于访问某些硬件寄存器或类似寄存器。
您的代码还有其他问题。
#include<stdio.h>
void main(){
printf("\n %p ",*(0x7ffeae3b3674));
}
Run Code Online (Sandbox Code Playgroud)
首先,它必须是int main(void)适当的原型main。
第二:你没有指针类型。虽然您可以通过如上所示的强制转换来解决此问题,但您也可以尝试使用 将其打印为指针%p。但是,当您取消引用指针时,您需要它所指向的值的类型。可能int是你的情况。
第三:你使用的地址没有用。您不能假设某个变量位于特定地址。您的程序每次加载时可以使用不同的地址。还有第一次测试中曾经存在的变量,它不再出现在新测试中。编译器不会在此位置保留内存。无论存储在那里的是什么,它都不属于您!访问它的是UB。