C ++修改结构传递给函数作为指针

时间:2015-09-27 15:28:54

标签: c++ pointers struct

我有以下结构:

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;

第二个编译,但我在调试器中得到访问冲突。 有什么想法吗?

编辑: 这是我在Codeblocks中遇到的错误:

'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)) ===|

4 个答案:

答案 0 :(得分:2)

第二个没有在Wandbox上用gcc 4.8.2编译这个错误:

  

错误:请求会员' RequestID' in' * lppResult',它是指针类型' LPWFSRESULT {aka _wfs_result *}' (也许你打算使用' - >'?

由于WFSRESULTWFSRESULT**类型,请尝试以下操作:(*lppResult)->RequestID = 123;

答案 1 :(得分:2)

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

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

答案 2 :(得分:1)

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

变量的类型为WFSRESULT*,而非WFSRESULT。这意味着该函数应该为WFSRESULT分配一个内存,并将一个指向WFSRESULT结构的指针放入输出变量中。

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

您可以通过指针解除引用来避免在堆上创建新对象

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

然后你可以毫无问题地传递和修改输出参数。

答案 3 :(得分:0)

LppResult是一个2级指针,这就是你违反访问权限的原因。尝试更多时间。