【发布时间】: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 请通过找出在引用的内存之前是否有任何东西来解释您想要实现的目标。假设这是不可能的,并描述你真正需要的而不是不可能的。那么这里的人更有可能告诉你如何实现你的实际可能目标,而不是帮助你完成不可能的事情。