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