簡體   English   中英

在從void指針強制轉換的結構中訪問char指針

[英]Accessing char pointer in a struct which was casted from a void pointer

我對此有些困惑:

我的函數fillData(void* db)應該傳遞一個指向struct tdpatientProfile的指針,該指針包含在struct tdWAKDAllStateConfigure作為一個名為patientProfile的成員。 我只有一個void指針pData (這是作為void*傳遞的tdWAKDAllStateConfigure指針),它是另一個結構Qtoken的成員,因此我需要tdWAKDAllStateConfigure void指針轉換為tdWAKDAllStateConfigure然后才能訪問patientProfile 因為那時patientProfile已經被取消引用,但是我需要一個指向它的指針,所以我在開頭添加了&

&(((tdWAKDAllStateConfigure*)Qtoken.pData)->patientProfile)

從理論上講應該可以使用,但是patientProfile具有成員char指針name[50] ,應使用strncpy進行填充。 filldata內部,我將void指針投射回了strncpy調用內部。

strncpy(((tdPatientProfile*)db)->name, sourcestring, passedChars)

此時,我的代碼崩潰了。 我無法驗證它是否正確地轉換,因為它們是空指針,因此我無法在調試器中查找它們,並且洞察力的內存視圖不起作用,因為它運行在我連接的虛擬ARM平台上gdb / insight對其進行調試。

經過2個小時的測試和調試,我不明白。 這里有人知道出了什么問題嗎?

好的,更多代碼,這不是公共代碼,因此我將嘗試將其減少到最少。

我有一個數據庫線程,該線程調用一個應從文件中讀取值的函數。 數據庫線程有一個本地成員Qtoken,該成員包含一個空指針pData,文件中的值應寫入該指針。 數據庫線程內部的函數調用為:

unified_read(dataID_PatientProfile,&(((tdWAKDAllStateConfigure*)Qtoken.pData)->patientProfile))

標頭:

uint8_t unified_read(tdDataId datatype, void* db);

在Unified_read內部,我打開文件等,然后調用另一個函數,該函數應將文件內部的數據解析為; 並將先前的字符復制到PatientProfile的字符名稱[50]中。 對parse函數的函數調用:

parseString(&ptr, ((tdPatientProfile*)db)->name, 50);

標頭

uint8_t parseString(char** ptr, char* destination, size_t destinationSize)

在parse函數中,一切正常(ptr必須是雙指針,因為需要增加它,因為destinationSize是正確的,並且也取消了對ptr的引用),它將找到; 16個字符之后,將其保存在passChars中。 但是這個strncpy函數調用打破了它並使我的代碼崩潰:

strncpy(destination, *ptr, passedChars);

嗯,我應該補充一點:2周前我遇到了這個問題,只是更改了將Unified_read傳遞給tdWAKDAllStateConfigure的指針的代碼,並自行取消引用PatientProfile。 這很好用,但是我的編碼負責人不想僅僅為了更改其中的PatientProfile成員而傳遞整個tdWAKDAllStateConfigure。

另一個測試:

tdPatientProfile testomat;
char str1[]= "To be or not to be";
strncpy(testomat.name, str1, 15);

if(!unified_read(dataID_PatientProfile,&testomat))

這按預期工作。 所以我的轉換&((((tdWAKDAllStateConfigure *)Qtoken.pData)-> PatientProfile)似乎是錯誤的。

記住:我得到了pData,它是一個空指針。 這需要強制轉換為tdWAKDAllStateConfigure指針,以便我可以獲取指向其成員PatientProfile(這是tdPatientProfile)的指針。 我的錯在哪里

這不過是一個瘋狂的猜測,但是每當我看到strncpy()時,我都會感到緊張。 我確定您知道strncpy()是有害的,因為它並不總是正確地終止目標字符串。 那可能是你的問題嗎?

您可能還需要考慮將strncpy的arg3設為sizeof(name)-1,或者比passedChars更安全。

我願意打賭,問題與強制轉換void *無關:這畢竟是void *的用途 -保留指向任何類型的指針。 如果比較強制轉換之后的void *和char *,我想您會發現它們一點一點一樣。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM