OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 6079|回复: 5

如何释放结构体指针所指向的空间?

[复制链接]

2

主题

29

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
5192
金钱
5192
注册时间
2013-11-10
在线时间
623 小时
发表于 2016-3-12 11:55:41 | 显示全部楼层 |阅读模式
1金钱
typedef struct
{
   u16 backcolor;  //背景色
   u16 start_x;        //开始的x坐标
   u16 start_y;        //开始的y坐标
   u8 seat_id[10];
}_seat_info;
_seat_info *seat_info;
seat_info=(_seat_info *)mymalloc(SRAMIN,100);        //分配_seat_info结构体

使用myfree 好像只能释放seat_info存储的地址空间,并不能释放地址所指向的空间?那如何释放结构体指针所指向的空间?






最佳答案

查看完整内容[请看2#楼]

内存池就是一块内存地址,你的结构体类型和一般类型比如整形类型一样,都是类型,只是定义结构体变量后占内存空间大点而已,你用动态内存来操作,只要空间够用就行,就如用这个池子,放苹果和放西瓜一般,装得下就行了。至于释放动态内存,你分配的内存结构体类型内存空间是连续的,分配时返回分配连续内存的首地址,你释放的时候,只要释放指向这个首地址的指针这片连续内存就被释放掉了。动态内存,比如链表,分配内存是不连续的 ...
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

10

主题

560

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1783
金钱
1783
注册时间
2014-6-27
在线时间
964 小时
发表于 2016-3-12 11:55:42 | 显示全部楼层
内存池就是一块内存地址,你的结构体类型和一般类型比如整形类型一样,都是类型,只是定义结构体变量后占内存空间大点而已,你用动态内存来操作,只要空间够用就行,就如用这个池子,放苹果和放西瓜一般,装得下就行了。至于释放动态内存,你分配的内存结构体类型内存空间是连续的,分配时返回分配连续内存的首地址,你释放的时候,只要释放指向这个首地址的指针这片连续内存就被释放掉了。动态内存,比如链表,分配内存是不连续的,释放就要分别释放了。
回复

使用道具 举报

2

主题

29

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
5192
金钱
5192
注册时间
2013-11-10
在线时间
623 小时
 楼主| 发表于 2016-3-12 14:04:36 | 显示全部楼层
本帖最后由 校草02 于 2016-3-12 14:07 编辑

//输入结构体对象的地址,将它的各个属性 全置为0;
void free_seat_info(_seat_info *addr)
{ u8 i;
  addr->backcolor=0;
  addr->start_x=0;
  addr->start_y=0;
  for(i=0;i<8;i++)
  {
           addr->seat_id=0;
  }
}
、、、、、、、、输入:&seat_info[0].backcolor   、、、、、、、、、、、、、
free_seat_info((_seat_info *)&seat_info[0].backcolor);   
、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、

经过实验,好像可行。。。因为用mymalloc申请一大块内存,以前会失败,但free_seat_info()释放后,不会失败了。
1、那问题来了,这样真的可行吗?算是释放了吗?
2、使用mymalloc后,结构体指针指向的内存位于哪里?难道是mem1base[MEM1_MAX_SIZE]内存池里?


回复

使用道具 举报

2

主题

29

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
5192
金钱
5192
注册时间
2013-11-10
在线时间
623 小时
 楼主| 发表于 2016-3-12 14:26:28 | 显示全部楼层
本帖最后由 校草02 于 2016-3-12 14:27 编辑

经过实验:
1、打印出mem1base[MEM1_MAX_SIZE] 的地址范围是:0x20001d84-0x2000bd83
      &mem1base[0]是0x20001d84;
      &mem1base[MEM1_MAX_SIZE-1]是0x2000bd83;
2、seat_info结构体指针指向的内存地址范围是:0x2000b204-0x2000b9c0
     &seat_info[0].backcolor 地址是0x2000b204;
     &seat_info[1].backcolor 地址是0x2000b218;
     &seat_info[99].backcolor 地址是0x2000b9c0;

3、由1、2可知:结构体指针指向的内存位于 mem1base[MEM1_MAX_SIZE]内存池里。

那问题来了,为什么结构体指针指向的内存位于 mem1base[MEM1_MAX_SIZE]内存池里?
      
回复

使用道具 举报

3

主题

548

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
1383
金钱
1383
注册时间
2015-2-3
在线时间
197 小时
发表于 2016-3-12 17:15:41 | 显示全部楼层
这涉及内存管理算法了,去看原子哥的内存管理教程
回复

使用道具 举报

2

主题

29

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
5192
金钱
5192
注册时间
2013-11-10
在线时间
623 小时
 楼主| 发表于 2016-3-12 22:26:44 | 显示全部楼层
yyx112358 发表于 2016-3-12 17:15
这涉及内存管理算法了,去看原子哥的内存管理教程

不好意思,详细看了原子的内存管理实验,还是没有想通
为什么结构体指针指向的内存位于 mem1base[MEM1_MAX_SIZE]内存池里?
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-2-26 09:28

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表