给定一个指向内存地址的未知指针访问结构 - C

Posted

技术标签:

【中文标题】给定一个指向内存地址的未知指针访问结构 - C【英文标题】:Accessing a struct given an unknown pointer to a memory address - C 【发布时间】:2020-02-07 11:31:15 【问题描述】:

假设我通过函数的参数传递给我一个(void*)ptr(我的基本理解是,它表示一个指向未知数据类型区域的指针)。我正在尝试弄清楚如何访问并检查结构是否存在后面的几个地址。

为了澄清,我正在使用一个大 char 数组(未分配),传递给函数的 ptr 应该指向数组中未指定数据类型的地址。位于此数据之前的是我尝试访问的结构。

void function(void *ptr)

       void *structPtr = (void*)((void*)ptr - sizeof(struct block));

这能让我得到一个指向位于初始“ptr”后面的结构地址的指针吗?如果是这样,我如何检查它是否是块结构?

提前道歉,我知道这段代码并不具体,因为我对这些概念完全陌生,而且,我正在提出一个算法,但还没有实现它。非常感谢对可能有用信息的任何引用。

【问题讨论】:

你一定喜欢“地雷上的踢踏舞……”。在上面的代码中,不能保证地址ptr - sizeof(struct block) 是您可以访问的。算术没有问题(转换为char* 将解决您的void* 问题),但这不是向后查看内存(到较低地址)的可靠方法。我们将需要更多进一步评论。请提供A Minimal, Complete, and Verifiable Example (MCVE)。 1) 不允许使用 void 指针进行数学运算(从技术上讲,尽管一些编译器 (gcc) 允许这样做)。 2)structPtr 需要void * 以外的类型,否则就没什么用了。 3) 无法确定您所指向的实际上是 struct block,但签名和 CRC 是提供一定程度置信度的常用方法。 这是一个 XY 问题。 meta.stackexchange.com/questions/66377/what-is-the-xy-problem 请通过找出在引用的内存之前是否有任何东西来解释您想要实现的目标。假设这是不可能的,并描述你真正需要的而不是不可能的。那么这里的人更有可能告诉你如何实现你的实际可能目标,而不是帮助你完成不可能的事情。 【参考方案1】:

您尝试做的事情是有风险的,因为您必须确保您在内存中找到了正确的位置。通常,我们在 struct 块中添加一些幻数,以便我们可以在这里测试我们不会去任何地方。

这种模式一般用在内存分配器中, 以https://sourceware.org/glibc/wiki/MallocInternals 为例。

【讨论】:

【参考方案2】:

通常的写法是这样的:

...function(void *ptr) 
    struct block *hdr = (struct block *)ptr - 1;

依靠指针算法自动缩放指向类型的大小。只要这里传入的所有指针最初都是通过获取指向有效struct block 的指针并将其加1(以获取其后的内存)创建的,就可以了。

【讨论】:

以上是关于给定一个指向内存地址的未知指针访问结构 - C的主要内容,如果未能解决你的问题,请参考以下文章

指针——指向内存地址的变量

数据结构知识基础之指针

C 语言指针数据类型 ( 指针类型变量 与 指针指向的内存块 概念区别 | 指针赋值 | 指针运算 | 内存赋值 | 内存取值 | 内存修改注意事项 )

iOS - 链表

C语言中 内存消亡 指向她的指针就一定消亡或成了空指针为啥是错的啊

结构体指针