qq_37106574 2022-07-06 14: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 15: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;
    }
     
    
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(2条)

报告相同问题?

问题事件

  • 系统已结题 7月15日
  • 已采纳回答 7月7日
  • 创建了问题 7月6日

悬赏问题

  • ¥15 linux驱动,linux应用,多线程
  • ¥20 我要一个分身加定位两个功能的安卓app
  • ¥15 基于FOC驱动器,如何实现卡丁车下坡无阻力的遛坡的效果
  • ¥15 IAR程序莫名变量多重定义
  • ¥15 (标签-UDP|关键词-client)
  • ¥15 关于库卡officelite无法与虚拟机通讯的问题
  • ¥15 目标检测项目无法读取视频
  • ¥15 GEO datasets中基因芯片数据仅仅提供了normalized signal如何进行差异分析
  • ¥100 求采集电商背景音乐的方法
  • ¥15 数学建模竞赛求指导帮助