首页 > 解决方案 > 程序何时可以使用内存?

问题描述

我有这两个程序只是为了理解指针是如何工作的。第一个被命名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);
}

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

我接下来要做的是将每个文件编译到testtest1分别使用 gcc(我正在使用 linux)并运行以下命令./test | xargs ./test1,这给了我以下错误xargs: ./test1: terminated by signal 11。我知道这是因为分段错误 test1 正在引发,因为如果我不尝试取消引用指针,我不会收到此错误。但我不明白为什么我会遇到段错误。即使在我释放内存(取消注释第一个程序中的注释)之后,我仍然会遇到分段错误。我期待得到一些垃圾值而不是段错误。我开始处理整个过程和指针的事情,所以肯定有我遗漏的东西,我希望有人能解释或指导我找到资源。

只是重新提出我的问题,程序如何在不分配特定内存的情况下访问它

标签: cpointers

解决方案


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

这不起作用有几个原因。

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

其次,您使用了错误的类型。Anint不足以存储指针值 - 在将结果转换并分配给之后肯定会丢失一些数字,因此将其转换回指针不会为您提供正确的地址strtolnum

类型intptr_tuintptr_tinstddef.h是足够大的整数类型来存储指针值,但是它们的实现是可选的,并且仍然不能确定是否strtol可以准确地转换输入值。


推荐阅读