在Google
进行了大量研究后,我发现了以下程序
#include <stdio.h>
int main()
{
int val;
char *a = (char*) 0x1000;
*a = 20;
val = *a;
printf("%d", val);
}
但它在run time
处抛出*a = 20
错误。
然后我如何写和读取特定的内存位置?
请帮帮我
答案 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)
如果您在用户空间(您是)运行代码,那么您获得的所有地址都是 虚拟地址 ,而不是 物理地址 即可。您不能只假设并写入任何虚拟地址 事实上,对于虚拟内存模型,您不能只假设任何地址是有效地址。内存管理器可以将有效地址返回给编译器实现,而编译器实现将其处理到您的用户程序,而不是反过来。
为了使您的程序能够写入地址:
答案 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)
首先,您需要确定要写入的内存位置。 然后,检查您是否有足够的写入权限。