【问题标题】:Casting object pointer to double void pointer (pointer to pointer to void)将对象指针转换为双 void 指针(指向 void 的指针)
【发布时间】:2021-07-22 14:37:00
【问题描述】:

我在一个库中有一个类方法(不能改变它),它接受一个双空指针作为它的参数之一。声明如下:

bool Queue::pop(void **packet, int &size, unsigned short &sn)

在我的应用程序代码中,我想向该函数传递一个指向另一种对象的指针,在本例中为GstBuffer 指针类型。如果我将指针转换为(void**),如下面的 sn-p 所示,我似乎可以在没有任何编译器错误的情况下执行此操作,但我怀疑这是否会导致正确的行为。这样转换指针有效吗?

guint16 sn;
int size;
GstBuffer *buf; 
Queue *Q = ... // create a Queue instance
Q->pop((void **)&buf, size, sn);  // is this conversion valid?
size = gst_buffer_get_size(buf);

【问题讨论】:

    标签: c++ pointers casting type-conversion pointer-to-pointer


    【解决方案1】:

    出于所有意图和目的,void 指针可以保存任何对象(数据类型)的地址,它可以指向任何对象,并且可以进行类型转换对于任何对象,您的代码都是有效的,我只会使用更惯用的演员表:

    Q->pop(reinterpret_cast<void**>(&buf), size, sn);
    

    §7.3.12 指针转换 [conv.ptr]

    1. 类型“指向 cv T”的纯右值,其中T 是对象类型,可以转换为类型“指向 cv void”的纯右值。此转换未更改指针值(6.8.3)。

    Example:

    void example(void **packet){
        std::cout << *packet << "\n";                   // pointer value
        std::cout << packet << "\n";                    // pointer address
        std::cout << **reinterpret_cast<int**>(packet); // value
    }
    
    int main() 
    {
        int* x = new int(20);
        std::cout << x << "\n";                         // pointer value
        std::cout << &x << "\n";                        // pointer address
        example(reinterpret_cast<void**>(&x));       
        delete x;
    }
    

    输出:

    0xb83eb0
    0x7ffc181ab2c8
    0xb83eb0
    0x7ffc181ab2c8
    20
    

    甚至只需要显式转换,因为它是指向指针的指针,否则转换将是隐式的,不需要转换。

    【讨论】:

    • @PluginPenguin 你是绝对正确的,智能指针要好得多,但出于这个答案的目的,我觉得不需要使用它,但值得一提。
    猜你喜欢
    • 1970-01-01
    • 2014-05-30
    • 2013-12-18
    • 1970-01-01
    • 2012-11-21
    • 1970-01-01
    • 2021-09-20
    • 1970-01-01
    相关资源
    最近更新 更多