Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/59.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在C中释放联合数组?_C_Free_Unions - Fatal编程技术网

如何在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));