我尝试了下面的程序使指针指向一个特定的地址并在该地址中存储一个值。当我使指针包含指定地址的值时,我得到一个运行时错误问我关闭程序。 是不是可以为地址0x6778分配一个值。为什么会这样?在什么情况下需要这个?请帮我理解。
int *p=(int*)0x6778;
printf("The address is:%x",p);
当试图做* p = 1000时,我收到错误。
答案 0 :(得分:5)
有很多原因会导致错误:
地址0x6778
可能不属于此进程的虚拟内存 - 它可能并非真正“存在”。您可以阅读有关虚拟内存的更多信息,但基本上地址不直接引用物理字节 - 它们必须在表中翻译,并且该表可能没有您的地址条目。
如果已映射,则可能位于只读页面
如果它是映射和可写的,它可能会损坏程序的其他部分,很快就会导致段错误。
通常,您可能无法写入用户级应用程序中的任意地址。当然,如果您正在运行内核或嵌入式系统,请忽略此答案,因为它完全不适用; - )
答案 1 :(得分:3)
该地址可能不在您的进程的地址空间中,因此当您尝试访问该程序时,您的程序会从操作系统收到异常。您不应该尝试使用特定的内存位置来存储内容...而是使用malloc
进行动态分配,或者将内容放在堆栈中。
答案 2 :(得分:1)
int *p=(int*)0x6778;
为此,地址位置0x6778
应该是首先有效的地址位置。
地址空间被分配给每个进程,您的程序在特定进程中运行,如果程序试图访问超出其地址空间的地址位置,那么它将崩溃。在您的情况下似乎发生了这种情况。
除非您确定虚拟地址位置有效供程序使用不要明确地访问地址位置,否则让编译器将类型放入地址分配给您的流程的空间并将其返还给您。要做到这一点,最简单的方法是只使用自动存储的局部变量或使用malloc
进行动态分配。