c - 错误 : invalid type argument of unary ‘*’ (have ‘long int’ )

标签 c pointers

这是我编写的一个小程序,用于打印存储在内存位置 (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/

相关文章:

比较两个文本文件 - C 语言拼写检查程序

c++ - 我如何同时读取一系列字符值作为字符和整数并进行比较?

c - 为什么取消引用 main 函数不显示内存内容?

C++ 内存管理

c - 查找指向字符数组的指针的索引

c - fatal error : 'mcheck.h' file not found

c - swprintf 在 8 位范围之外的字符上阻塞

ODBC 中的 SQL 语句

c++ - 将 optional 与 reference_wrapper 结合起来有意义吗?

c - 使用指针时 C 中的段错误