簡體   English   中英

離開 function 后結構變量值發生更改

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

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