如何在C中释放联合数组?
我有一个函数返回一个联合数组,我需要在使用它之后释放一个联合数组 更新代码: 这是一个结构如何在C中释放联合数组?,c,free,unions,C,Free,Unions,我有一个函数返回一个联合数组,我需要在使用它之后释放一个联合数组 更新代码: 这是一个结构 typedef union _data { float F; uint8_t B[4]; } floatCharFunction; 这是一个读取函数: void HW_SWversion(version state,floatCharFunction* ver) { floatCharFunction fVersionRead[2] = {0,0};//SW-HW *ver =
typedef union _data {
float F;
uint8_t B[4];
} floatCharFunction;
这是一个读取函数:
void HW_SWversion(version state,floatCharFunction* ver)
{
floatCharFunction fVersionRead[2] = {0,0};//SW-HW
*ver = *fVersionRead;
//floatCharFunction SW,HW;
if(state == SAVE_VERSION)
{
FLASH_ERASE(_4KB,VERSION_BASE_ADDR);
fVersionRead[0].F =VERSION_SW;
fVersionRead[01].F =VERSION_HW;
FLASH_WRITE(fVersionRead[0].B,VERSION_BASE_ADDR,VERSION_SIZE_IN_BYTES/2);
FLASH_WRITE(fVersionRead[1].B,VERSION_BASE_ADDR+VERSION_SIZE_IN_BYTES/2,VERSION_SIZE_IN_BYTES/2);
}else if(state == READ_VERSION)
{
FLASH_READ(VERSION_BASE_ADDR,fVersionRead[0].B, VERSION_SIZE_IN_BYTES/2);
FLASH_READ(VERSION_BASE_ADDR+VERSION_SIZE_IN_BYTES/2,fVersionRead[1].B, VERSION_SIZE_IN_BYTES/2);
//u16VersionRead = (versions[0] << 8) | versions[1];
}else return;
}
代码中有两个问题:
ver=HW\u-SWversion(读取版本)代码>重新分配
,泄漏上一行中分配的内存版本
返回指向立即超出范围的自动变量的指针。访问此变量的结果未定义HW_SWversion
HW_SWversion
更改为更新指向客户端分配实例的指针
void HW_SWversion(version state, floatCharFunction* ver)
{
/* assign version info */
}
int main()
{
floatCharFunction ver[2];
HW_SWversion(READ_VERSION, &ver);
}
或者,如果要使用动态分配的内存
void HW_SWversion(version state, floatCharFunction* ver)
{
/* assign version info */
}
int main()
{
floatCharFunction* ver = malloc(2*sizeof(*ver));
if (ver == NULL) {
printf("out of memory\n");
exit(1);
}
HW_SWversion(READ_VERSION, ver);
free(ver);
}
我需要在使用联合数组后释放它
当您开始使用它时,该数组已经“释放”。由于它是一个具有自动存储持续时间的本地变量,因此它超出范围,并在函数返回时解除分配。因此,您正在使用指向不存在对象的指针,因此您的代码当前调用未定义的行为
最好是malloc()。当然,之后您需要free()
it(就像在代码中一样)
但是我相信任何一本介绍C语言的书都可以向你展示这一点。也许你可以试试这个
免费(免费)
系统会记住ver的内存位置,并知道此ptr的内存大小。您的代码有以下问题:
- 您正在
malloc
为main
中的floatCharFunction
添加一些内存
- 您没有将此内存提供给您的
HW\u SWversion
来填充或修改
- 在您的
HW\u SWversion
中,堆栈上的floatCharFunction
正在使用一些内存,
范围:本地到HW\u-SWversion
- 您正在返回自动变量的内存地址
- 一旦退出
HW_SWversion
时,局部变量就会超出范围
- 您正试图
释放
超出范围的内存,这将导致未定义的行为
- 您的
malloc
ed内存指针值丢失,因此内存泄漏
解决方案:
不要使用malloc
并将内存作为参数传递给HW_SWversion
,如下所示:
void HW_SWversion(version state, floatCharFunction* ver)
{
*ver = /* assign version info */
}
int main()
{
floatCharFunction ver[2];
HW_SWversion(READ_VERSION, &ver);
}
或
如果要使用动态分配::
floatCharFunction* HW_SWversion(version state)
{
floatCharFunction *pVersion = malloc(2*sizeof(floatCharFunction));
return pVersion;
}
main()
{
//
floatCharFunction *ver = HW_SWversion(READ_VERSION);
free (ver) ;
}
正如我所看到的那样
floatCharFunction fVersionRead[2];//SW-HW
是一个局部变量,用法如下:
ver = HW_SWversion(READ_VERSION);
在这种情况下,是一种未定义的行为,因为fVersionRead
是在堆栈上分配的。没有人保证结果是正确的。决定、堆栈还是堆?(但不是两者都有)
关键字static
延长函数外部变量的生存期
如果你选择堆栈,不要调用free
,否则free(ver)代码>就是你所需要的。你不需要任何malloc
在这里。我免费试用(ver);但是我仍然在内存中看到一个数组,其版本号为free(ver)
works,但是malloc应该移动到HW\u SWversion()
body.Btw,我不认为释放数组会删除此内容:它只是将内存标记为可用,但只要您不覆盖它,您仍会在内存中看到数据。不会重新分配…ver。它不再指向malloced内存。我没有否决,但避免回答may、try等。如果您不确定,请尝试,分析它,然后回答。错误[Pe167]:类型为“union\U data**”的参数与类型为“union\U data*”的参数不兼容\HW\u SWversion(READ\u VERSION,&ver)//错误对于第二种情况,让HW\u SWversion()
进行分配并返回新指针不是更有意义吗?@user3428151我已经修复了第二个代码段中的一个拼写错误,并省略了HW\u SWversion
的实现(我想你应该比我更了解这一点)@我稍微偏爱当前表单,因为它支持使用动态或自动分配的客户端。如果您将其视为纯粹的动态分配示例,那么我同意malloc
应该移动
ver = HW_SWversion(READ_VERSION);
/* Stack (Note static) */
static floatCharFunction fVersionRead[2]; //SW-HW
floatCharFunction *pVersion = fVersionRead;
return pVersion;
/* Heap */
floatCharFunction *ver = (floatCharFunction *)malloc(2*sizeof(floatCharFunction));