C++修改结构传递到用作指针

问题描述:

我有以下结构:C++修改结构传递到用作指针

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

的指针结构被传递给该函数:

int DLL_EXPORT WFSGetInfo (HSERVICE hService, DWORD dwCategory, LPVOID 
lpQueryDetails, DWORD dwTimeOut, LPWFSRESULT * lppResult) 

然而,当我尝试修改函数里面的struct,它不会让我(不编译) 这是我试图在函数里面访问它的:

lppResult->RequestID = 123; 
or 
(*lppResult).RequestID = 123; 

第二个编译,但在调试器中出现访问冲突。 有什么想法?

编辑: 这是我在代码块得到的错误:

'RequestID' in 'lppResult', which is of non-class type '_wfs_result**'| 
||=== Build failed: 1 error(s), 2 warning(s) (0 minute(s), 0 second(s)) ===| 
+2

我们是否猜测您收到的诊断信息? –

LPWFSRESULT * lppResult是指向结构的指针。通常这意味着它是一个输出参数。您将一个指针传递给应该存储结果的变量。

变量的类型是WFSRESULT*,而不是WFSRESULT。这意味着该功能预计会为WFSRESULT分配一个内存,并将一个指向WFSRESULT结构的指针放入输出变量中。

你的问题是,你认为*lppResult包含有效的指针,而实际上它包含垃圾。

可避免指针在堆上创建新的对象解引用

int DLL_EXPORT WFSGetInfo (HSERVICE hService, DWORD dwCategory, LPVOID lpQueryDetails, DWORD dwTimeOut, WFSRESULT & lppResult); 

然后,你可以通过和修改输出参数没有任何问题。

+0

因此,基本上我需要在函数内自己创建结构,并将指针存储到传入指针的地址处。 – msbir

+0

是的。但我建议取消指针并仅传递指向结构的指针。在这种情况下,结构的内存由调用者分配。 –

+0

对不起,我不能让它工作,请问你能在几行代码中描述你的意思吗? – msbir

第二个与此错误上Wandbox没有编译用gcc 4.8.2:

error: request for member 'RequestID' in '* lppResult', which is of pointer type 'LPWFSRESULT {aka _wfs_result*}' (maybe you meant to use '->' ?

由于WFSRESULT是类型WFSRESULT**,请试试这个:(*lppResult)->RequestID = 123;

+0

这一个在调试器中引发访问冲突。 – msbir

+0

[Wandbox](http://melpon.org/wandbox/permlink/g8bm9fz28KCawdmx)中没有发生分段错误。检查你的内存分配或获取代码的指针。 – MikeCAT

+0

@msbir如果您发布了一个完整的,可编辑的示例,其他人可以更容易地重现您的问题。 –

你有一个指针指针,所以你需要对它进行两次取消引用。 (*lppResult)->RequestID会起作用。

但是,在Windows上,这种签名通常意味着被调用的函数需要分配内存并将其分配给lppResult。在这种情况下,您需要这样做。

LppResult是一个2级指针,这就是为什么你有访问冲突。尝试让它更多的时间。