指向结构指针数组的指针

时间:2017-03-20 16:59:14

标签: c++ c dll cen-xfs

我需要创建一个指向以空值终止的指向关键细节结构的指针数组的指针。

结构: WFS_RESULT

typedef struct _wfs_result
{
    REQUESTID       RequestID;
    HSERVICE        hService;
    SYSTEMTIME      tsTimestamp;
    HRESULT         hResult;
    union {
        DWORD       dwCommandCode;
        DWORD       dwEventID;
    } u;
    LPVOID          lpBuffer;
} WFSRESULT, *LPWFSRESULT;

结构: PINKEY

typedef struct _wfs_pin_key_detail_ex
{
LPSTR         lpsKeyName;
DWORD         dwUse;
BYTE          bGeneration;
BYTE          bVersion;
BYTE          bActivatingDate[4];
BYTE          bExpiryDate[4];
BOOL          bLoaded;
} WFSPINKEYDETAILEX, * LPWFSPINKEYDETAILEX;

计划:我如何尝试

    LPWFSPINKEYDETAILEX* array[7];

    LPWFSPINKEYDETAILEX Test;
    WFSPINKEYDETAILEX Obj;
    Test = &Obj;

    Test->lpsKeyName = NULL;

    array[0] = &Test;
    array[1] = &Test;
    array[2] = &Test;
    array[3] = &Test;
    array[4] = &Test;
    array[5] = &Test;
    array[6] = NULL;

    LPWFSPINKEYDETAILEX** val = array;

    lpWFSResult->lpBuffer = val;

问题是,我在指针数组上面做了什么?因为,我需要将此指针数组指针传递给此参数lpWFSResult-> lpBuffer = val;,并且在最终程序(Bank Application)中,它会给出错误-15(WFS_ERR_INTERNAL_ERROR)。

3 个答案:

答案 0 :(得分:0)

就像想法一样。也许他们检查是否是不同的对象。也许他们正在使用前面的指针,并且在更改val [1]后不会期望更改val [0]的值。

同时检查API,也许他们希望其他字段填满

  • lpsKeyName
  • bGeneration
  • bActivatingDate
  • bExpiryDate

答案 1 :(得分:0)

这取决于数组的创建方式以及存储/使用的位置。根据提供的代码,我假设数组已经在内存堆栈上生成,但是在弹出堆栈级别之后使用(即函数返回)。数组内存已被释放,数组指针无效(将导致意外行为)。如果需要将数组保留在堆栈外部,则需要使用new在堆上生成它。这样,在函数退出并弹出内存堆栈级别后,内存将保持不变。

LPWFSPINKEYDETAILEX** array = new LPWFSPINKEYDETAILEX*[7];

LPWFSPINKEYDETAILEX Test;
WFSPINKEYDETAILEX Obj;
Test = &Obj;

Test->lpsKeyName = NULL;

array[0] = &Test;
array[1] = &Test;
array[2] = &Test;
array[3] = &Test;
array[4] = &Test;
array[5] = &Test;
array[6] = NULL;

lpWFSResult->lpBuffer = array;

当你完成内存后不要忘记delete,这样就不会出现内存泄漏。

答案 2 :(得分:0)

您需要阅读API规范,告诉您如何分配内存。我假设您正在编写SP,有六个密钥,密钥名称在数组keyNames中。

int numKeys=6;
LPSTR keyNames[6]={"key1","key2","key3","key4","key5","key6"};
LPWFSRESULT pResult;
LPWFSPINKEYDETAILEX* ppDetails;
WFMAllocateBuffer(sizeof(WFSRESULT), WFS_MEM_ZEROINIT, (LPVOID*)&pResult);
WFMAllocateMore(sizeof(LPWFSPINKEYDETAILEX)*(numKeys+1),pResult, (LPVOID*)&ppDetails);
for (int i=0;i<numKeys;i++)
{
  WFMAllocateMore(sizeof(WFSPINKEYDETAILEX),pResult,(LPVOID*)&ppDetails[i]);
  WFMAllocateMore(strlen(keyNames[i])+1,pResult,(LPVOID*)&ppDetail[i].lpsKeyName);
  strcpy(ppDetails[i].lpsKeyName,keyNames[i]);
  //TODO fill in other details
}
ppDetails[numKeys]=NULL;
pResult->lpBuffer=ppDetails;