美文网首页
void指针使用(避坑)

void指针使用(避坑)

作者: 雯饰太一 | 来源:发表于2023-06-27 07:59 被阅读0次
    void GetVoid(void* pV)
    {
        void*& pp = *(void**)pV;
        int* aPtr = *(int**)pp;
        int a = *aPtr;//10
    
        double* pd = new double;
        *pd = 100.0;
    
        pp = (void*)&pd;
    }
    
    int main(int argc, char* argv[])
    {
        
        int a = 10;
        int* aPtr = &a;
        void* pV = (void*)&aPtr;
        GetVoid((void*)&pV);
    
        void* pw = *(void**)&pV;
        double* dpp = *(double**)pV;
        double dd = *dpp;//100.0
    }
    

    使用void ptr的时候,其实就是一个疯狂开门关门的情况,可以对任意门进行定位,可以按照期望的类型开门取值,但是上述代码中new出来的double值还是没有释放的,int值因为是一个局部变量,只是将地址转换成了void ptr带入了函数,是不需要释放的。

    void ptr自身可以认为是一个指针类型的变量,是不需要释放的。

    再一看,这里使用的是address of void ptr,实际上就是void**,用起来更花,不推荐,这种代码简直没法看,推荐少些,放在这里,长个记性吧。

    void*数组

    int main(int argc, char* argv[])
    
    //malloc arr
        void** voidArr;
        int voidArrSize = 3;
        voidArr = (void**)malloc(voidArrSize * sizeof(void*));
    
        //test val
        int typeIntVal = 10;
        double typeDoubleVal = 100.0;
        const char* typeCharPtrVal = "name";
    
        //init arr
        voidArr[0] = (void*)&typeIntVal;
        *(voidArr + 1) = (void*)&typeDoubleVal;
        voidArr[2] = (void*)typeCharPtrVal;
    
        //get val
        int _typeIntVal = *(int*)voidArr[0];//10
        double _typeDoubleVal = *(double*)*(voidArr+1);//100.0
        const char* _typeCharPtrVal = (const char*)*(voidArr + 2);//"name"
    
        //free
        free(voidArr);
        voidArr = nullptr;
    }
    

    备注:方便用于参数传递,毕竟指针都是一样长的,但正因为没有类型,所以在排查的时候比较困难。

    相关文章

      网友评论

          本文标题:void指针使用(避坑)

          本文链接:https://www.haomeiwen.com/subject/yxqiydtx.html