读写内存位置

时间:2012-06-26 12:56:37

标签: c codeblocks

Google进行了大量研究后,我发现了以下程序

#include <stdio.h>

int main()
{
    int val;
    char *a = (char*) 0x1000;
    *a = 20;
    val = *a;
    printf("%d", val);
}

但它在run time处抛出*a = 20错误。

然后我如何写和读取特定的内存位置?

请帮帮我

9 个答案:

答案 0 :(得分:16)

您正在执行此操作,但在您的系统上,您无法写入此内存导致分段错误。

分段错误(通常缩写为段错误),总线错误或访问冲突通常尝试访问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;
}

你也可以用非常简单的方式在堆栈上分配内存:

#include <stdio.h>
int main()
{
    int val;
    char *a;
    char b;

    a = &b;
    *a = 20;
    val = (int)*a;

    printf("%d", val);

    return 0;
}

答案 1 :(得分:7)

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

答案 2 :(得分:3)

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

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

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

答案 3 :(得分:3)

你不能随便写任何随机地址。您只能修改程序可以写入的内存内容。

如果你需要修改某个变量的内容,那就是指针的原因。

char a = 'x';
char* ptr = &a; // stored at some 0x....
*ptr = 'b'; // you just wrote at 0x....

答案 4 :(得分:2)

权限问题,操作系统将保护内存空间免受随机访问。

您没有指定确切的错误,但我的猜测是您收到的“segmentation fault”会明确指出存储器访问冲突。

答案 5 :(得分:1)

您可以写入特定的内存位置。

但只有当您有权写入该位置时才能使用。

您所获得的是禁止您写信至0x1000的操作系统。

答案 6 :(得分:1)

这是将数据写入内存位置0x1000的正确方法。但是在虚拟内存的这个时代,你几乎永远不会知道你想要提前写入的实际内存位置,所以从来没有使用过这种类型的东西。

如果你能告诉我们你试图解决的实际问题,也许我们可以提供帮助。

答案 7 :(得分:1)

您不能随机选择内存位置并写入。必须为您分配内存位置,并且必须是可写的。

一般来说,您可以使用&获取变量的引用/地址,并在其上写入数据。或者你可以使用malloc()来请求堆上的空间来写入数据。

此答案仅涵盖如何在内存上写入和读取数据。但是我没有介绍如何以正确的方式进行,以便程序正常运行。其他答案可能比我的更好。

答案 8 :(得分:-1)

首先,您需要确定要写入的内存位置。 然后,检查您是否有足够的写入权限。