这是我编写的一个小程序,用于打印存储在内存位置 (0x7fffdf222fec) 的值。我收到 错误 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));
}
预期结果是该地址存储的垃圾值
我写了一个这样的程序,得到了一个as的地址
#include<stdio.h>
void main(){
int a;
printf("%p",&a);
}
0x7ffeae3b3674
然后我将上面的地址应用到第一个程序。
最佳答案
将 *(0x7fffdf222fec)
更改为 *(int*)0x7fffdf222fec
。
0x7fffdf222fec
是一个 long int
类型的常量。您不能取消引用非指针类型,因此您需要先将其转换为指针。选择哪个指针取决于您希望如何解释该地址处的数据。我在此示例中选择了 int*
,但您可以选择除 void*
之外的任何指针类型。
请注意,这很可能会导致段错误。除非您确定您有权访问该位置,否则不要这样做。
澄清一下:
Cannot i access values at this location using this way?
嗯,这取决于你的意思。这是读取特定位置的正确方法。问题是您可能无法访问它。
访问控制通常是您无法触及的。段错误基本上是操作系统告诉您您做了一些顽皮的事情的方式。
您可以阅读有关段错误的更多信息 here
获得对内存任意部分的访问权限非常复杂,而且在很大程度上依赖于系统。它在 Unix 机器上的完成方式与在 Windows 机器上的完成方式不同。
还要记住,大多数现代操作系统都使用虚拟内存,因此您尝试读取的地址不是物理地址。操作系统将虚拟地址映射到物理地址。阅读更多 here
I wrote a program like this and got the address of a as
您不能保证每次运行该程序时都能获得相同的地址。如果你已经声明了一个变量,你显然可以访问它。尝试多次运行该程序。您每次获得不同地址的可能性很高。
除非您有非常具体的需求,例如编码驱动程序、内核或嵌入式系统,否则您永远不必担心绝对地址。
关于c - 错误 : invalid type argument of unary ‘*’ (have ‘long int’ ),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56288012/