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

C++ Modifying struct passed to function as a pointer

本文关键字:函数 结构 指针 修改 C++      更新时间:2023-10-16

我有以下结构:

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)

然而,当我试图修改函数内部的结构时,它不允许我(不编译(这就是我试图在函数内部访问它的方式:

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

第二个没有在Wandbox:上使用gcc 4.8.2编译时出现此错误

错误:请求"*lppResult"中的成员"RequestID",该成员的指针类型为"LPWFSRESULT{aka_wfs_result*}"(可能您打算使用"->"?

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

您有一个指向指针的指针,因此需要取消引用它两次。(*lppResult)->RequestID会起作用。

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

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

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

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

通过指针取消引用,可以避免在堆上创建新对象

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

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

LppResult是一个级别2的指针,这就是访问冲突的原因。试着多给它一点时间。