结构变量值在离开函数后被改变

Struct variable values are altered after leaving the function

我很难为 post 写一个正确的标题。如果它不是 100% 准确,请原谅我。 因为,最初的问题只是释放一个 malloced 输出而不影响它被分配到的位置。然后我决定在释放它之前将源 (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 也会被释放(因为它们只是一个指针并指向相同的内存位置)。 注意: 函数 Encrypt_Data_Base64 有几个嵌套函数在下面调用,它有 malloced 输出。这就是我尝试释放从那里获取的内存的原因。

然后我决定复制 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] = '[=11=]';
// ------- addition ends------
Publish.pData = pTemp
free(encrypt_Data);

结构变量值保存完好。到目前为止,一切都很好。 然后我必须将结构传递给库函数(我没有它的源代码)。

问题#2

CLIENT_Publish(&Publish); // This is how it supposed to be.
//Prototype: int CLIENT_Publish(CLIENT_MESSAGE* pPublish);

而这一次,当我调试时,只要我当前的函数被保留并调用那个函数 在执行任何其他操作之前,结构值已被更改。我认为这可能与 non-terminated 字符串有关。因此,我添加了 NUL 终止,正如您在上面的解决尝试中看到的那样。但是没有用。

离开函数前的数组内容(要求块在0到12之间)

进入其他函数时数组内容(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