读取和写入内存位置

2023-11-27

经过谷歌大量研究后,我发现了这个程序:

#include <stdio.h>

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

但它抛出一个运行时错误,在*a = 20.

那么如何写入和读取特定的内存位置呢?


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

分段错误(通常缩写为 segfault)、总线错误或访问冲突通常是尝试访问 CPU 无法物理寻址的内存。当硬件通知操作系统有关内存访问冲突时,就会发生这种情况。然后,操作系统内核向引发异常的进程发送信号。默认情况下,接收信号的进程会转储核心并终止。还可以覆盖默认信号处理程序以自定义信号的处理方式。

如果您有兴趣了解更多信息,请在维基百科上查找 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;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

读取和写入内存位置 的相关文章

随机推荐