微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

程序什么时候可以使用内存?

如何解决程序什么时候可以使用内存?

我有这两个程序只是为了了解指针的工作方式。第一个命名为test.c,下面是代码

#include <stdio.h>
#include <stdlib.h>
int main(void)
{
int *mem = malloc(sizeof(int) * 1);
*mem = 90;
//free(mem);
printf("%p",mem);
return (0);
}

所以基本上我拥有的是一个程序,该程序为一个整数分配一个位置,然后将该地址打印到标准输出中。在注释部分,我将在分配值后释放分配的内存。稍后我将讨论为什么要发表评论。这是我的第二个代码。它位于名为test1.c文件中。这是代码

#include <stdio.h>
#include <stdlib.h>
int main(int argc,char** argv)
{
int num = (int)strtol(argv[1],NULL,16);
int *mem = (void *)(long)num;

printf("at test1 string> %s,changed to pointer-->%p,after being dereferenced-->%i\n",argv[1],mem,*mem);
return (0);
}

在第二个程序中,从命令行获取输入,然后将其更改为指针(地址)。它假定传递的是十六进制字符串。它的作用只是打印通过的内存地址,然后尝试获取该地址的值。

接下来我要做的是使用gcc(我正在使用linux)将每个文件分别编译为testtest1并运行以下命令./test | xargs ./test1,这给了我以下错误xargs: ./test1: terminated by signal 11。我知道这是由于test1分段错误引发的,因为如果我不尝试取消引用指针,就不会得到此错误。但是我不明白为什么会出现段错误。即使释放内存(取消对第一个程序中的注释的注释),我仍然会遇到分段错误。我本来希望获得一些垃圾值而不是段错误。我正在着手进行整个过程和指针操作,因此请确保我缺少某些内容,希望有人能向我解释或指导我。

仅回答我的问题,程序如何在不分配内存的情况下访问特定内存

解决方法

你不能。

内存地址分为几页(通常为4096字节)。访问地址时,CPU在进程的“页表”中查找包含该地址的页。该表说明了该地址在物理内存(即“哪个RAM芯片”)中的位置。

因此,您无法访问进程的页表中没有的地址。句号。

如何将页面添加到页面表中?您询问操作系统。在Windows上,该函数称为VirtualAlloc。在Linux上,它称为mmap。或者,您可以使用malloc之类的函数,该函数只能分配页面的一小部分(通过拆分从OS获得的页面)。

此外,每个进程都有不同的页表。因此,地址在不同的过程中意味着不同的事物。也许test进程可能具有页面0x12345000的页面表条目,但test1进程却没有,因为它们是完全不同的表。这就是为什么将指针从一个进程发送到另一个进程没有意义的原因。

在过去的计算中,没有页表,指针是实际的RAM地址,但是那一天早已过去。

编辑:您还可以要求操作系统将同一页同时放在两个不同进程的页表中-这称为共享内存

,

因此,如果我了解您在做什么,那么您将从一个程序中打印动态分配的内存块的地址,并将其剪切并粘贴为第二个程序的输入,然后尝试访问该地址。

有几个原因导致此方法不起作用。

首先是user253751指出的-地址不会映射到不同的进程。进程A中的0x1234与进程B中的0x1234映射到不同的物理存储单元。存在一些在运行中的进程之间设置共享内存的方法,但是要比这多得多。

第二,您使用了错误的类型。 int的大小不足以存储指针值-在将strtol的结果并将其分配给num之后,您肯定会丢失一些数字,因此将其转换回指针就可以了找不到正确的地址。

intptr_t中的类型uintptr_tstddef.h是足以存储指针值的整数类型,但是它们的实现是可选的,还不能肯定{{1} }可以准确地转换输入值。

,

虽然user253751给出了很好的技术说明,但我想让它更适合初学者使用: 您的操作系统确保一个进程无法访问另一进程的内存,因为这意味着您可以操纵或破坏其他程序或窃取其数据(例如密码)。 C语言不会检查指针,因此您可以将它们设置为所需的任何内容,但是如果您要访问该地址,则操作系统会阻止您,因为它具有安全功能。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。