C 错误:一元‘;的类型参数无效*’;(具有长整型)

C 错误:一元‘;的类型参数无效*’;(具有长整型),c,pointers,C,Pointers,这是我编写的一个小程序,用于打印存储在内存位置(0x7fffdf222fec)的值。我得到的错误为4:20:错误:一元“*”的类型参数无效(具有'long int'printf(“\n%p”,*(0x7fffdf222fec)); 我在ubuntu 16.04中使用gcc编译器。我的ram是4 GB。我不能用这种方式访问这个位置的值吗 #include<stdio.h> void main(){ printf("\n %p ",*(0x7ffeae3b3674)); }

这是我编写的一个小程序,用于打印存储在内存位置(0x7fffdf222fec)的值。我得到的
错误为4:20:错误:一元“*”的类型参数无效(具有'long int'printf(“\n%p”,*(0x7fffdf222fec));

我在ubuntu 16.04中使用gcc编译器。我的ram是4 GB。我不能用这种方式访问这个位置的值吗

#include<stdio.h>
void main(){
    printf("\n  %p   ",*(0x7ffeae3b3674));
}
#包括
void main(){
printf(“\n%p”,*(0x7ffeae3b3674));
}
预期结果是存储在该地址的垃圾值

我写了一个这样的程序,得到了一个as的地址

#include<stdio.h>
void main(){
    int a;
    printf("%p",&a);
}
#包括
void main(){
INTA;
printf(“%p”和“&a”);
}
0x7ffeae3b3674

然后我将上述地址应用于第一个程序。

*(0x7fffdf222fec)
更改为
*(int*)0x7fffdf222fec

0x7fffdf222fec
是一个类型为
long int
的常量。您无法取消对非指针类型的引用,因此需要先将其转换为指针。选择哪个指针取决于您希望如何解释该地址的数据。对于本例,我选择了
int*
,但您可以选择除
void之外的任何指针类型*

请注意,这很可能会导致故障。除非您确定自己有权访问该位置,否则不要这样做

澄清:

我不能用这种方式访问此位置的值吗

#include<stdio.h>
void main(){
    printf("\n  %p   ",*(0x7ffeae3b3674));
}
嗯,这取决于你的意思。这是阅读特定位置的正确方式。问题是你可能无法访问它

访问控制通常是你够不着的。分段故障基本上是操作系统告诉你你做了一些不正常的事情的方式

您可以阅读有关分段错误的更多信息

获取对内存任意部分的访问非常复杂,而且严重依赖于系统。在Unix计算机上的访问方式与在Windows计算机上的访问方式不同

还要记住,大多数现代操作系统都使用虚拟内存,因此您尝试读取的地址不是物理地址。操作系统将虚拟地址映射到物理地址。请阅读更多

我写了一个这样的程序,得到了一个as的地址

#include<stdio.h>
void main(){
    int a;
    printf("%p",&a);
}
您不能保证每次运行程序时都能获得相同的地址。如果您声明了一个变量,那么您显然有权访问它。请尝试运行该程序几次。每次都有可能获得不同的地址


除非您有非常特殊的需求,例如编码驱动程序、内核或嵌入式系统,否则您永远不应该担心绝对地址。

我试图搜索一个关于从给定地址读取值的重复问题

这只需要将普通地址值转换为指针

诸如此类:

int *p = (int *)0x1000000;
printf("value=%d", *p);
但你的问题有点不同

通常,给定的地址用于访问某些硬件寄存器或类似寄存器

您的代码还有其他问题

#include<stdio.h>
void main(){
  printf("\n  %p   ",*(0x7ffeae3b3674));
}
#包括
void main(){
printf(“\n%p”,*(0x7ffeae3b3674));
}
首先,它必须是
intmain(void)
作为
main
的合适原型

第二:您没有指针类型。虽然您可以使用如上所示的强制转换来解决此问题,但您也可以尝试使用
%p
将其打印为指针。但是当您取消引用指针时,您需要它所指向的值的类型。在您的情况下,可能是
int

第三:你使用的地址是无用的。 您不能假设某个变量位于特定的地址。每次加载时,您的程序可以使用不同的地址。 也是第一个测试中使用的变量,它不再出现在新测试中。编译器将不会在此位置保留内存。
无论存储在那里的是什么,它都不属于您!访问它是UB。

如果没有类型,就不能有值

引用第6.2.5节类型p1

存储在对象中或由函数返回的值的含义由用于访问它的表达式的类型决定

您尝试取消对地址的引用
0x7ffeae3b3674
,但没有告诉它该地址的对象是什么类型的

对象是数据存储的一个区域,其内容包含值,但为了获得对象的值,您需要通知它对象的类型,以便编译器知道如何解码给定对象的信息

在给定地址,当您知道那里有一个整数时,您需要通知它取消引用int类型的对象,方法是首先将地址强制转换为指向integer的指针,这样
*
运算符将取消引用整数(并使用
%d
通知printf传递的参数是int类型的对象):


可能出现的另一个问题是,在从第一个程序获得地址后,您无法知道在第二次编译后编译器是否会将变量
a
分配给相同的地址,或者内存段是否仍然有效。您需要使用
readelf

检查
0x7FFF222中存储了什么值fec
memory?基于此,您可以将其类型转换为特定类型的指针。您为什么认为,该文本是指针?存储在内存位置的类型值?您只能取消引用具有指针类型的值。指针类型的变量或转换为指针类型的结果。您为什么认为当你再次运行这个程序时会是一样的吗?更有趣的是:你怎么会认为,如果你的函数中没有更多的变量,那么在同一个位置会保留一些内存?谢谢Gerhardh耐心地解释了这么多。现在我想我明白了。谢谢you@Gerhardth我试过了,但我是g