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