【问题标题】:What does the expression "BIO *client = (BIO *)arg" mean?表达式“BIO *client = (BIO *)arg”是什么意思?
【发布时间】:2023-04-09 15:49:01
【问题描述】:

这是代码的上下文:

void THREAD_CC server_thread(void *arg)
{
    BIO *client = (BIO *)arg;
        ...
}

表达式(BIO *)arg 是否将void 指针arg 转换为指向BIO 的指针?我不确定我是否做对了。

任何帮助将不胜感激!

禅宗

【问题讨论】:

    标签: c pointers void-pointers


    【解决方案1】:

    这叫做演员表;它不会转换指针,它会说服编译器相信传入的指针(无类型)实际上是指向 BIO 的指针,并将其视为 BIO。

    【讨论】:

    • 是的。这是唯一可能的正确答案。这样的转换不会“转换”任何东西,它只是要求编译器闭嘴。
    • 不,它确实转换了指针。如果void * 指针和BIO * 指针有不同的表示,它会将前者变为后者。这相当于将int 转换为long - 当然,在一些 系统上它可能是无操作的,但通常不是。
    • @caf ??你什么意思?指针的“性质”可以根据被指点者改变吗?
    • @ShinTakezou: 没错 - pointer-to-type-A 的大小、表示和对齐要求可能与 pointer-to-type-B 的不同。对此有一些限制 - 例如。 void *char * 必须相同,所有指向struct 的指针必须相同。例如,这允许实现使用在取消引用时检查的类型信息来标记指针类型。
    • ShinTakezou:尽管这就是当今最常见的机器的工作方式(所有指针在下面看起来都一样),但 C 标准通常不需要它(如果标准的作者想要做出这样的保证) , 他们会)。例如,double 必须是 8 字节对齐的机器可能会合理地使用指针值的 lower N-3 位来寻址内存中的 double s - 在这样的机器上,将 @ 987654331@ 与void * 之间需要换班。
    【解决方案2】:

    是的。 (BIO *) casts void * 指针 (arg) 的类型为 BIO *

    【讨论】:

      【解决方案3】:

      它将 void* 转换(转换)为 BIO* 类型的指针。它并不“指向” BIO。

      【讨论】:

        【解决方案4】:

        您的输入变量 arg 是 void 类型。 Typecasting 只是将一种类型的变量转换为另一种类型。当您将指针作为参数传递给不同的函数并在取消引用它们时将它们类型转换为它们的原始类型时,这很有用。

        在上述情况下,您将 arg 从 (void *) 类型转换为 (BIO *) 类型。现在您可以像访问普通 BIO * 指针类型一样访问 ponter client 的成员。

        【讨论】:

          猜你喜欢
          • 2016-11-25
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-10-02
          • 2012-06-10
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多