c - 程序何时可以使用内存?
问题描述
我有这两个程序只是为了理解指针是如何工作的。第一个被命名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);
}
在第二个程序中,从命令行获取输入,然后将其更改为指针(地址)。它假定传递的是一个十六进制字符串。它所做的只是打印传递的内存地址,然后尝试获取该地址的值。
我接下来要做的是将每个文件编译到test
并test1
分别使用 gcc(我正在使用 linux)并运行以下命令./test | xargs ./test1
,这给了我以下错误xargs: ./test1: terminated by signal 11
。我知道这是因为分段错误 test1 正在引发,因为如果我不尝试取消引用指针,我不会收到此错误。但我不明白为什么我会遇到段错误。即使在我释放内存(取消注释第一个程序中的注释)之后,我仍然会遇到分段错误。我期待得到一些垃圾值而不是段错误。我开始处理整个过程和指针的事情,所以肯定有我遗漏的东西,我希望有人能解释或指导我找到资源。
只是重新提出我的问题,程序如何在不分配特定内存的情况下访问它?
解决方案
因此,如果我理解您在做什么,您正在从一个程序打印动态分配的内存块的地址,将其作为输入剪切并粘贴到第二个程序,然后该程序会尝试访问该地址。
这不起作用有几个原因。
首先是 user253751 指出的 - 地址不会映射到不同的进程。 0x1234
在进程 A 中映射到与进程 B 中不同的物理内存单元0x1234
。有一些方法可以在正在运行的进程之间设置共享内存,但工作量比这要多。
其次,您使用了错误的类型。Anint
不足以存储指针值 - 在将结果转换并分配给之后肯定会丢失一些数字,因此将其转换回指针不会为您提供正确的地址strtol
。num
类型intptr_t
和uintptr_t
instddef.h
是足够大的整数类型来存储指针值,但是它们的实现是可选的,并且仍然不能确定是否strtol
可以准确地转换输入值。
推荐阅读
- node.js - 本地运行的 NodeJS 中 SocketIO 生成的 URL
- powershell - PowerShell 导出 AD 用户 x509 证书并为用户导入 ADUC
- python - `zip()` 中生成器的额外 next()?
- ios - Swift 设计模式 - 动作?
- azure - 更新刷新令牌寿命 Azure AD B2C 用户流是否会使当前刷新令牌过期
- graphviz - Graphviz - 如何为每个子图设置不同的布局?
- javascript - javascript 对象方法中的新构造函数
- javascript - Azure http-trigger 函数使用 multipart/form-data 查询 HTTP POST 请求
- node.js - 在 NodeJS netlify-lambda 上运行的 Lambda 函数出错 — “TypeError: Expected signal to be an instanceof AbortSignal”
- java - 我如何在 Spring Boot 中使用 Query 和 Pageable