OpenEdv-开源电子网

 找回密码
 立即注册

扫一扫,访问微社区

正点原子新作:阿波罗STM32F767&F429&探索者STM32F4开发板&赶快来下载资料哦。

查看: 100|回复: 1

slab动态内存管理中关于void*的用法

[复制链接]

  离线 

13

主题

38

帖子

0

精华

初级会员

Rank: 2

积分
167
金钱
167
注册时间
2014-10-29
在线时间
20 小时
发表于 2018-5-29 08:29:42 | 显示全部楼层 |阅读模式
1金钱
问题描述:在动态内存管理slab.c文件中的
void rt_system_heap_init(void *begin_addr, void *end_addr)
{
        。。。
        在函数的尾部调用了:
        memusage = rt_page_alloc(limsize / RT_MM_PAGE_SIZE);
}
memusage 是一个静态全局指针变量:static  struct memusage  *memusage  =  RT_NULL;但是,函数void *rt_page_alloc(rt_size_t npages)的返回值类型为void *;
疑问:这里的赋值操作,不需要类型强制转换吗?struct memusage  *memusage  = void *
补充:在函数void *rt_page_alloc(rt_size_t npages)中有 return  b; b的类型为struct  rt_page_head *b ;这个可以理解:void *可以容纳所有类型的指针变量;
          void * 指针的用法:
                        1.        任何类型的指针都可以赋值给void*
                                example: void *p = int *q;
                        2      当void *的指针赋值给Type型指针时,需要进行强制转换;
                                   example : type *q = (type *)p;
                        3.        当再次取指针变量的地址时,即二级指针,还是可以赋值给void *的,但是不能够进行解引用;
                                   void *p = &q;

最佳答案

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

可以编译看编译器的报错结果
回复

使用道具 举报

  离线 

497

主题

9万

帖子

31

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
128316
金钱
128316
注册时间
2010-12-1
在线时间
1136 小时
发表于 2018-5-29 08:29:43 | 显示全部楼层
可以编译看编译器的报错结果
回复

使用道具 举报

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

本版积分规则




QQ|联系我们|手机版|官方淘宝店|新浪微博|微信公众平台|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2018-6-24 22:20

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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