【问题标题】:Get struct's size passed as void to function获取结构的大小作为 void 传递给函数
【发布时间】:2012-06-13 22:15:09
【问题描述】:

我正在更改数据库库中的一些代码。它的工作方式我发送一个 void 指针,为了获得它的大小,我调用一个查询并使用查询计算结构的大小。现在的问题是我将结构作为参数接收,但函数在第一次提取之前/中间失败。之后我需要清除结构,但我什至没有大小。 我知道最好的方法是将结构的大小作为参数发送,但是我已经编译了成千上万的程序,库是 1996 年的,所以我需要找到一种方法来计算结构大小,即使类型是 void .

我的一个想法是计算下一个不在结构中的元素的位置

0x000010              0x000042
[int|char[30]|int|int][int]

所以大小是32,因为0x00042-0x000010是32。

有没有办法知道我什么时候离开了这个结构。

函数的原型是

int getData(char* fields, void* myStruct)

我需要找出结构大小。

对不起,如果我错过了一些信息,代码是巨大的,很遗憾我不能在这里发布。

【问题讨论】:

  • 您是否将 myStruct 转换为某种结构类型?如果是这样,您可以只使用该结构的 sizeof 吗?
  • 0x000010 0x000042 [int|char[30]|int|int][int] 是什么?顺便说一句“0x00042 - 0x000010”是*0x*32。
  • 你知道结构布局吗?是可变大小的,取决于第一个 int 字段吗?顺便说一句:大小 0x32(十进制 50)不太可能,因为整数需要在 4 字节边界上对齐(假设 4 字节整数等)
  • 地址只是为了说明问题,并不真实

标签: c pointers struct sybase


【解决方案1】:

不,一般来说,给定void *,你无法弄清楚你在追求什么。您唯一能做的就是将其与 NULL 进行比较,这在此处当然没有帮助。

请注意,void * 中没有任何内容甚至表示它指向 struct,它也可以指向数组的中间。

如果您有一些全局方法在指针传递给getData() 之前记录它们,您也许可以实现一个查找函数,该函数只需将指针值与之前记录的值进行比较,但这只是使用指针值作为键。

【讨论】:

  • 是的,void* 的主要缺点是它的字面意思是根本没有类型信息...
猜你喜欢
  • 2012-11-08
  • 2013-10-19
  • 1970-01-01
  • 2021-11-19
  • 1970-01-01
  • 1970-01-01
  • 2013-12-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多