读写内存位置

Ras*_*yak 5 c codeblocks

经过大量研究后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)


Ric*_*III 8

这会抛出一个段违规(SEGFAULT),因为你不知道该地址放了什么.最有可能的,那就是内核空间,托管环境不希望你不情愿地写入另一个应用程序的内存.您应该只写入您知道程序可以访问的内存,否则您将在运行时遇到无法解释的崩溃.

  • 用户代码无法访问内核空间(ring),这是现代操作系统,虚拟内存和MMU的基础.否则你是对的. (6认同)

Alo*_*ave 5

如果您在用户空间中运行代码(您就是这样),那么您获得的所有地址都是虚拟地址而不是物理地址。您不能只是假设并写入任何虚拟地址。
事实上,使用虚拟内存模型,您不能假设任何地址都是有效地址。内存管理器将有效地址返回给编译器实现,编译器实现将其处理给您的用户程序,而不是相反。

为了使您的程序能够写入地址:

  1. 它应该是一个有效的虚拟地址
  2. 它应该可以访问您的程序的地址空间