2015-09-27 66 views
-2

我有以下結構: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

我們是否猜測您收到的診斷信息? –

回答

1

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

2

第二個與此錯誤上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如果您發佈了一個完整的,可編輯的示例,其他人可以更容易地重現您的問題。 –

2

你有一個指針指針,所以你需要對它進行兩次取消引用。 (*lppResult)->RequestID會起作用。

但是,在Windows上,這種簽名通常意味着被調用的函數需要分配內存並將其分配給lppResult。在這種情況下,您需要這樣做。

0

LppResult是一個2級指針,這就是爲什麼你有訪問衝突。嘗試讓它更多的時間。