【问题标题】:Finding the type of elements given a void pointer查找给定空指针的元素类型
【发布时间】:2014-03-17 19:18:32
【问题描述】:

如果给我一个指向元素数组的 void 指针,是否有办法在“C”中找出存储在数组中的元素类型(即元素的数据类型)?

如果我将此 void 指针类型转换为随机数据类型并尝试遍历数组,会发生什么情况?

【问题讨论】:

  • 您将获得您已将数组转换为的元素类型(当然,假设您已转换为某种指针类型)

标签: c void-pointers


【解决方案1】:

简短回答:不,未定义的行为。

长答案:您必须将指针转换为合适的内容。有很多方法可以解决这个问题,但前提是您将与 void 指针本身一起传递有关数组中每个元素的宽度的信息。

【讨论】:

  • 好的。我遇到了一个问题,要反转指向列表的指针为 void **head 的元素列表。所以,我想我必须假设一个类型来解决这个问题。
  • 这是一个双指针。宽度始终为 8,因为指针的宽度为 8。
  • 是的,我知道在 64 位系统中指针宽度为 8,但是如果我需要使用指针遍历元素数组,我仍然需要知道它的类型,对吗?跨度>
  • 这就是我要说的。你知道类型。双指针是指向指针列表的指针。因此,如果您的列表头是void ** head,那么列表中的每个元素都是一个指针,宽度为 8。有关类型的所有信息都包含在列表的参数中。
【解决方案2】:

最好的选择是 GPF,在最坏的情况下,您将在 GPF 之前执行一些随机代码。在 C 中,强制转换除了“考虑”一个特定类型的指针之外什么都不做,唯一负责强制转换是有效的就是你。

【讨论】:

    【解决方案3】:

    您不可能知道数组中的类型,因为它“只是一个数字”,包含一个地址。将指针转换为不同的类型是未定义的行为,并且可能会产生对齐问题,这可能会根据您的架构产生 CPU 异常。

    【讨论】:

      【解决方案4】:

      没有通用的方法,但是如果您了解变量中可能的数据类型,并且这些不同的数据类型在某些方面是独特的,那么您可以检查指针的起始字节尝试做出有根据的猜测(您可能首先要检查指针以确定它是否有任何禁止某些数据类型的对齐限制)。在调试之外(即您知道 某事 破坏了您的指针,但您不确定是什么)没有充分的理由这样做。

      【讨论】:

      • 感谢您的回复。
      猜你喜欢
      • 2016-01-16
      • 2010-12-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-11-27
      相关资源
      最近更新 更多