OpenEdv-开源电子网

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

UCOSIII里用mymallco()和myfree()?

[复制链接]

32

主题

171

帖子

0

精华

高级会员

Rank: 4

积分
697
金钱
697
注册时间
2017-1-7
在线时间
75 小时
发表于 2018-4-20 17:00:40 | 显示全部楼层 |阅读模式
5金钱
程序如图所示,我已经myfree()释放点buf910了,按道理printf()打印出来的应该是空的吧,但是还是有数据?
1.png

最佳答案

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

myfree只是在内存分配表中,清除了占用标志,表示可以分配给其他内容使用。这个过程中并没有清空这个数组的内存空间,也没有修改buf910的指向,所以此时使用printf()打印buf910是可以打印出内容的,也就是buf910此时是野指针。需要清空的话,可采用memset()函数
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

1

主题

20

帖子

0

精华

初级会员

Rank: 2

积分
66
金钱
66
注册时间
2018-1-22
在线时间
7 小时
发表于 2018-4-20 17:00:41 | 显示全部楼层
myfree只是在内存分配表中,清除了占用标志,表示可以分配给其他内容使用。这个过程中并没有清空这个数组的内存空间,也没有修改buf910的指向,所以此时使用printf()打印buf910是可以打印出内容的,也就是buf910此时是野指针。需要清空的话,可采用memset()函数
回复

使用道具 举报

32

主题

171

帖子

0

精华

高级会员

Rank: 4

积分
697
金钱
697
注册时间
2017-1-7
在线时间
75 小时
 楼主| 发表于 2018-4-21 12:10:18 | 显示全部楼层
清风徐徐 发表于 2018-4-20 17:00
myfree只是在内存分配表中,清除了占用标志,表示可以分配给其他内容使用。这个过程中并没有清空这个数组的 ...

能一次性申请几个内存,而不是申请一次,下一次申请前必须释放前一个才能申请??

char *p1=mymalloc(SARM,256);
char *p2=mymalloc(SRAM,512);

.....

myfree(SRAM,p1);
myfree(SRAM,p2);

而不是
char *p1=mymalloc(SRAM,256);
myfree(SRAM,p1);
..
char *p2=mymalloc(SRAM,512);
myfree(SRAM,p2)
回复

使用道具 举报

32

主题

171

帖子

0

精华

高级会员

Rank: 4

积分
697
金钱
697
注册时间
2017-1-7
在线时间
75 小时
 楼主| 发表于 2018-4-21 17:03:01 | 显示全部楼层
清风徐徐 发表于 2018-4-20 17:00
myfree只是在内存分配表中,清除了占用标志,表示可以分配给其他内容使用。这个过程中并没有清空这个数组的 ...

char *p=mymalloc(sramx,512);

...


myfree(sramx,p);


memset(p,0,sizeof(p));//这样能行吗?
回复

使用道具 举报

32

主题

171

帖子

0

精华

高级会员

Rank: 4

积分
697
金钱
697
注册时间
2017-1-7
在线时间
75 小时
 楼主| 发表于 2018-4-22 12:08:59 | 显示全部楼层
Jevin乐动 发表于 2018-4-21 17:03
char *p=mymalloc(sramx,512);

...

实测,memste(sramx,0,sizeof(p))不可行
回复

使用道具 举报

1

主题

20

帖子

0

精华

初级会员

Rank: 2

积分
66
金钱
66
注册时间
2018-1-22
在线时间
7 小时
发表于 2018-4-22 22:42:55 | 显示全部楼层
Jevin乐动 发表于 2018-4-21 12:10
能一次性申请几个内存,而不是申请一次,下一次申请前必须释放前一个才能申请??

char *p1=mymallo ...

可以这样申请。。内存管理模块,会分配不一样的地址空间,并会标记他们占用的空间,使他们操作的是不一样的空间。所以不影响
回复

使用道具 举报

1

主题

20

帖子

0

精华

初级会员

Rank: 2

积分
66
金钱
66
注册时间
2018-1-22
在线时间
7 小时
发表于 2018-4-22 22:47:43 | 显示全部楼层
Jevin乐动 发表于 2018-4-21 17:03
char *p=mymalloc(sramx,512);

...

楼主可以检查下sizeof(p)的值是多少,没猜错的话应该是4,因为p是指针,存储的是4个字节的地址。所以你这样写,应该只设置了4个字节空间。,而这应该是设置512个字节的空间。
所以应该是memset(p,0,512);
回复

使用道具 举报

32

主题

171

帖子

0

精华

高级会员

Rank: 4

积分
697
金钱
697
注册时间
2017-1-7
在线时间
75 小时
 楼主| 发表于 2018-4-23 12:36:17 | 显示全部楼层
清风徐徐 发表于 2018-4-22 22:47
楼主可以检查下sizeof(p)的值是多少,没猜错的话应该是4,因为p是指针,存储的是4个字节的地址。所以你这 ...

对,是这样,我试过了!谢谢大神
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2024-11-23 09:37

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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