[英]Struct variable values are altered after leaving the function
我很難為這篇文章寫一個正確的標題。 如果它不是 100% 准確,請原諒我。 因為,最初的問題只是釋放malloc
和 output 而不會干擾它被分配到的位置。 然后我決定在釋放它之前將源( encrypt_Data
)復制到另一個變量中。 然后這次又出現了一個問題。 這就是我所在的地方。 如果我至少能為其中一個找到合適的解決方案,那就太好了。
問題#1
typedef struct {
const char* sTopic;
const char* pData;
} CLIENT_MESSAGE;
CLIENT_MESSAGE Publish;
char * pData = "Hello World!";
char * encrypt_Data = Encrypt_Data_Base64(pData);
Publish.pData = encrypt_Data;
free(encrypt_Data);
如果我釋放encrypt_Data
, Publish.pData
也會被釋放(因為它們只是一個指針並指向同一個 memory 位置)。 Note that: The function Encrypt_Data_Base64
has several several nested function called underneath and it has malloc
ed output. 這就是我嘗試釋放從那里采購的 memory 的原因。
然后我決定制作一份encrypt_Data
的副本,這樣我就可以自由地釋放它了。
問題#1 解決嘗試
char * pData = "Hello World!";
char * encrypt_Data = Encrypt_Data_Base64(pData);
// ------- addition starts ------
int len = strlen(encrypt_Data);
char temp[len+1];
char * pTemp = temp;
memcpy(pTemp, encrypt_Data, len+1);
pTemp[len] = '\0';
// ------- addition ends------
Publish.pData = pTemp
free(encrypt_Data);
結構變量值保存得很好。 到目前為止,一切都很好。 然后我必須將結構傳遞給庫 function(我沒有它的源代碼)。
問題#2
CLIENT_Publish(&Publish); // This is how it supposed to be.
//Prototype: int CLIENT_Publish(CLIENT_MESSAGE* pPublish);
而這一次,當我調試時,只要我當前的 function 離開並在做任何其他事情之前調用那個,結構值就被改變了。 我認為這可能與非終止字符串有關。 因此,我添加了 NUL 終止,正如您在上面的解決嘗試中看到的那樣。 但這沒有幫助。
離開 function 之前的數組內容(需要的塊在 0 到 12 之間)
進入其他function(CLIENT_Publish)時的數組內容
由於我不能對庫部分做太多事情,所以我必須在我可以控制的部分做一些事情。
編輯:如果我在不使用這一行的情況下獲得我的價值char * encrypt_Data = Encrypt_Data_Base64(pData);
例如;
AFunction_GetPtr(&pData);
Publish.pData = pData;
CLIENT_Publish(&Publish);
這樣,它工作得又好又容易。 但是,我喜歡截取來自AFunction_GetPtr
的值並在Encrypt_Data_Base64
中使用它,然后將其傳遞給CLIENT_Publish
。
任何輸入高度贊賞。
這不是正確的解決方案,但您現在要做的最簡單的事情是:
char * pData = "Hello World!";
char * encrypt_Data = Encrypt_Data_Base64(pData);
Publish.pData = strdup(encrypt_Data);
free(encrypt_Data);
現在您已經制作了數據的另一個副本,您最終需要釋放它。 所以你不妨這樣做:
char * pData = "Hello World!";
char * encrypt_Data = Encrypt_Data_Base64(pData);
Publish.pData = encrypt_Data;
/* Do not free(encrypt_Data); */
請記住在不再需要時釋放Publish.pData
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.