关于void**指针数组的问题,函数形参是指针数组,调用的地址是一样的,但里面的数据不对
//查找设备
int FindDevices(void** devices, int maxCount)
{
U32 i;
PLX_STATUS rc;
PLX_DEVICE_KEY DevKey;
int connectCount=0;
i = 0;
do
{
// Reset device key structure
memset(&DevKey, PCI_FIELD_IGNORE, sizeof(PLX_DEVICE_KEY));
// Check if device exists
rc =PlxPci_DeviceFind(
&DevKey,
(U8)i
);
if (rc == ApiSuccess)
{
if ((DevKey.VendorId == VENDER_ID) && (DevKey.DeviceId == 0x9101))
{
devices[connectCount]=(void *)&DevKey;
connectCount++;
//return connectCount;
}
i++;
}
} while ((rc == ApiSuccess) && (i < maxCount));
return connectCount;
}
int main(int argc, const char *argv[])
{
PLX_DEVICE_KEY **devices= NULL;
int count;
devices = (PLX_DEVICE_KEY **)malloc(sizeof(PLX_DEVICE_KEY)*10);
count = FindDevices((void**)devices,10);
printf("%p\n",devices);
if(count == 0)
{
printf("count == 0");
}
else
{
printf("VID: %X , PID:%X",devices[0]->VendorId,devices[0]->DeviceId);
}
getchar();
return 0;
}
在dll内部地址和数据是一致的,回到main函数后地址一直数据却不一致
指针和内存这部分比较薄弱,希望指点一二
你只是给指针的指针分配了空间,但里面的每个指针都是空的啊
另外devices[connectCount]=(void *)&DevKey这么写也是不行的,DevKey是函数内的局部变量,当函数结束后,内存就被系统回收了,外部是不能再去操作的,已经不受你控制了
int FindDevices(void** devices, int maxCount)
{
U32 i;
PLX_STATUS rc;
int connectCount=0;
i = 0;
do
{
// Check if device exists
rc =PlxPci_DeviceFind(
devices[connectCount],
(U8)i
);
if (rc == ApiSuccess)
{
if ((devices[connectCount]->VendorId == VENDER_ID) && (devices[connectCount]->DeviceId == 0x9101))
{
connectCount++;
//return connectCount;
}
i++;
}
} while ((rc == ApiSuccess) && (i < maxCount));
return connectCount;
}
int main(int argc, const char *argv[])
{
PLX_DEVICE_KEY *devices= NULL;
int count;
devices = (PLX_DEVICE_KEY *)malloc(sizeof(PLX_DEVICE_KEY)*10);
count = FindDevices((void**)&devices,10);
printf("%p\n",devices);
if(count == 0)
{
printf("count = 0");
}
else
{
printf("VID: %X , PID:%X",devices[0]->VendorId,devices[0]->DeviceId);
}
getchar();
return 0;
}
你可以参考下这篇文章:c语言中void *的使用谢谢各位指点
修改版如下:
int main(int argc, const char *argv[])
{
PLX_DEVICE_KEY *devices[10];
int count,i;
bool ret;
for(i=0;i<10;i++)
devices[i] = (PLX_DEVICE_KEY *)malloc(sizeof(PLX_DEVICE_KEY));
count = FindDevices((void**)&devices,10);
printf("%p\n",devices);
if(count == 0)
{
printf("count == 0");
}
else
{
printf("VID: %X , PID:%X",devices[0]->VendorId,devices[0]->DeviceId);
}
ret = OpenDevice(devices[0]);
getchar();
return 0;
}
//查找设备
int FindDevices(void** devices, int maxCount)
{
U32 i;
PLX_STATUS rc;
PLX_DEVICE_KEY DevKey;
int connectCount=0;
i = 0;
do
{
// Reset device key structure
memset(devices[connectCount], PCI_FIELD_IGNORE, sizeof(PLX_DEVICE_KEY));
// Check if device exists
rc =PlxPci_DeviceFind(
//&DevKey,
(PLX_DEVICE_KEY*)devices[connectCount],
(U8)i
);
if (rc == ApiSuccess)
{
if (( ((PLX_DEVICE_KEY*)devices[connectCount])->VendorId == VENDER_ID) && (((PLX_DEVICE_KEY*)devices[connectCount])->DeviceId == PRODUCT_ID))
{
//devices[connectCount]=(void *)&DevKey;
connectCount++;
//return connectCount;
}
i++;
}
} while ((rc == ApiSuccess) && (i < maxCount));
return connectCount;
}