qq_37106574 2022-07-06 06:51 采纳率: 20%
浏览 63
已结题

C语言void**指针问题

问题

关于void**指针数组的问题,函数形参是指针数组,调用的地址是一样的,但里面的数据不对

DLL中调用函数的代码,其中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;
 }
主函数中调用Dll,然后打印里面的数据。
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函数后地址一直数据却不一致

img

img

指针和内存这部分比较薄弱,希望指点一二

展开全部

  • 写回答

3条回答 默认 最新

  • 快乐鹦鹉 2022-07-06 07:01
    关注

    你只是给指针的指针分配了空间,但里面的每个指针都是空的啊
    另外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;
    }
     
    
    

    展开全部

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
    qq_37106574 2022-07-06 08:01

    按照你的思路修改了代码,现在do while进入第二次循环时,memset就会报错,但是我在main中malloc了10个大小的结构体,为什么devices[1]时就会报错了呢?
    而且PLX_DEVICE_KEY *devices;这个是结构体指针把,和结构体指针数组不一样,导致只能用printf("VID: %X , PID:%X",devices->VendorId,devices->DeviceId);,而不是devices[0]->

    
        do
        {
            // Reset device key structure
            memset(&DevKey, PCI_FIELD_IGNORE, sizeof(PLX_DEVICE_KEY));
            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 == 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;
        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->VendorId,devices->DeviceId);
        }
        getchar();
    
        return 0;
    }
    
    

    回复
    qq_37106574 回复 qq_37106574 2022-07-06 08:02

    现在我只能在do while里直接return connectCount;才能正常运行,并且数据也是对的

    回复
    快乐鹦鹉 回复 qq_37106574 2022-07-06 08:11

    你要用devices[0]的话,只能是devices[0].----,不能用->啊,因为devices数组的元素不再是指针了

    回复
    展开全部4条评论
查看更多回答(2条)
编辑
预览

报告相同问题?

问题事件

  • 系统已结题 7月14日
  • 已采纳回答 7月7日
  • 创建了问题 7月6日
手机看
程序员都在用的中文IT技术交流社区

程序员都在用的中文IT技术交流社区

专业的中文 IT 技术社区,与千万技术人共成长

专业的中文 IT 技术社区,与千万技术人共成长

关注【CSDN】视频号,行业资讯、技术分享精彩不断,直播好礼送不停!

关注【CSDN】视频号,行业资讯、技术分享精彩不断,直播好礼送不停!

客服 返回
顶部