void指针使用(避坑)

2023-06-27  本文已影响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;
}

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

上一篇下一篇

猜你喜欢

热点阅读