经过大量研究后Google,我找到了以下程序
#include <stdio.h>
int main()
{
int val;
char *a = (char*) 0x1000;
*a = 20;
val = *a;
printf("%d", val);
}
Run Code Online (Sandbox Code Playgroud)
但它正在抛出一个run time错误*a = 20.
那我怎么写和读取特定的内存位置?
请帮我
Eri*_*tis 17
您正在执行此操作,但在您的系统上,您无法写入此内存导致分段错误.
分段错误(通常缩写为段错误),总线错误或访问冲突通常是尝试访问CPU无法物理寻址的内存.当硬件通知操作系统有关内存访问冲突时,会发生此错误.然后,OS内核向进程发送一个导致异常的信号.默认情况下,接收信号的进程转储核心并终止.还可以覆盖默认信号处理程序以自定义信号的处理方式.
如果您有兴趣了解更多在维基百科上查找MMU.
以下是如何合法地从堆中请求内存.该malloc()函数需要多个字节作为参数进行分配.请注意,完成使用后,每个内存malloc()都应匹配free()相同的内存.该free()呼叫通常应在相同的功能,你所谓的地方malloc().
#include <stdio.h>
int main()
{
int val;
char *a;
a = (char*)malloc(sizeof(char) * 1);
*a = 20;
val = (int)*a;
printf("%d", val);
free(a);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
您还可以通过非常简单的方式在堆栈上分配内存,如下所示:
#include <stdio.h>
int main()
{
int val;
char *a;
char b;
a = &b;
*a = 20;
val = (int)*a;
printf("%d", val);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
如果您在用户空间中运行代码(您就是这样),那么您获得的所有地址都是虚拟地址而不是物理地址。您不能只是假设并写入任何虚拟地址。
事实上,使用虚拟内存模型,您不能假设任何地址都是有效地址。内存管理器将有效地址返回给编译器实现,编译器实现将其处理给您的用户程序,而不是相反。
为了使您的程序能够写入地址: