[英]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.