【问题标题】:Can we dereference a void pointer without knowing its type?我们可以在不知道其类型的情况下取消引用 void 指针吗?
【发布时间】:2016-04-29 07:03:08
【问题描述】:

我对 c 语言中的 void 指针有疑问。我想知道我们能否在不知道 type 的情况下取消引用 void 指针

【问题讨论】:

标签: c


【解决方案1】:

不,因为你不知道如何解释相应内存空间所包含的数据。内存本身没有类型,它是包含类型信息的指针。例如,int * 指向的内存被解释为int

当取消引用void * 时,编译器无法判断从该地址开始的字节应该被解释为哪种类型。它可以是doubleunsigned long,甚至是chars 的数组。

但是,可以通过转换来取消引用 void *,因为转换运算符包含有关对象类型的信息。

【讨论】:

    【解决方案2】:

    不,void 指针 只能在显式转换后取消引用。例如:

    int a = 5;
    void *b = &a;
    printf(“%d\n”, *((int*)b));
    

    【讨论】:

    • 对,但是在演员表之后,从技术上讲,不知道它的类型不再适用。 :)
    • 您可以获取一个您不知道其类型的 void 指针,将其强制转换为 int*,然后取消引用它。所以从技术上讲,你可以。但究竟为什么有人会想要,我不知道。
    • @Magisch; char *a = "s"; void *x = s; char c = *(int *)x;,对吗?
    • @hacks 如有疑问,请尝试
    • @Magisch 我认为这是一个修辞问题。
    【解决方案3】:

    TL;DR不,你不能。

    在取消引用 pointer-to-type 时,您会生成 type 的“对象”。

    由于 void 不是完整类型,您不能直接取消引用 void*。这就是为什么,你需要要么

    • 将指针复制到另一个完整类型的指针
    • 将指针转换为另一个完整类型

    然后,您可以取消引用以获取 new 完整类型的对象。

    【讨论】:

    • TL;DR 是什么意思?
    • @EdHeal 什么?别告诉我你不知道这个。 :)
    • 如果我知道我不会问这个问题
    • @EdHeal 我不确定你是不是在开玩笑,但这在 SO 中很常见(我从这里学到的)。它代表Too long din't read (summary)。对于像您这样具有广泛影响力的人,我很惊讶您会看到这个新事物。 :)
    • 咖啡还没开始 :-(
    【解决方案4】:

    你不能。取消引用 void 指针需要事先进行显式转换。

    您当然可以将其转换为任何特定类型,然后在不知道其原始类型的情况下取消引用它,但是您为什么要这样做却超出了我的范围。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-09-01
      • 1970-01-01
      • 2012-01-02
      • 2020-06-20
      • 1970-01-01
      • 2020-11-08
      • 2021-02-02
      相关资源
      最近更新 更多