【发布时间】:2014-03-17 19:18:32
【问题描述】:
如果给我一个指向元素数组的 void 指针,是否有办法在“C”中找出存储在数组中的元素类型(即元素的数据类型)?
如果我将此 void 指针类型转换为随机数据类型并尝试遍历数组,会发生什么情况?
【问题讨论】:
-
您将获得您已将数组转换为的元素类型(当然,假设您已转换为某种指针类型)
标签: c void-pointers
如果给我一个指向元素数组的 void 指针,是否有办法在“C”中找出存储在数组中的元素类型(即元素的数据类型)?
如果我将此 void 指针类型转换为随机数据类型并尝试遍历数组,会发生什么情况?
【问题讨论】:
标签: c void-pointers
简短回答:不,未定义的行为。
长答案:您必须将指针转换为合适的内容。有很多方法可以解决这个问题,但前提是您将与 void 指针本身一起传递有关数组中每个元素的宽度的信息。
【讨论】:
void ** head,那么列表中的每个元素都是一个指针,宽度为 8。有关类型的所有信息都包含在列表的参数中。
最好的选择是 GPF,在最坏的情况下,您将在 GPF 之前执行一些随机代码。在 C 中,强制转换除了“考虑”一个特定类型的指针之外什么都不做,唯一负责强制转换是有效的就是你。
【讨论】:
您不可能知道数组中的类型,因为它“只是一个数字”,包含一个地址。将指针转换为不同的类型是未定义的行为,并且可能会产生对齐问题,这可能会根据您的架构产生 CPU 异常。
【讨论】:
没有通用的方法,但是如果您了解变量中可能的数据类型,并且这些不同的数据类型在某些方面是独特的,那么您可以检查指针的起始字节尝试做出有根据的猜测(您可能首先要检查指针以确定它是否有任何禁止某些数据类型的对齐限制)。在调试之外(即您知道 某事 破坏了您的指针,但您不确定是什么)没有充分的理由这样做。
【讨论】: