我需要创建一个指向以空值终止的指向关键细节结构的指针数组的指针。
结构: 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
)。
答案 0 :(得分:0)
就像想法一样。也许他们检查是否是不同的对象。也许他们正在使用前面的指针,并且在更改val [1]后不会期望更改val [0]的值。
同时检查API,也许他们希望其他字段填满
答案 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;