OpenEdv-开源电子网

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

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

[复制链接]

15

主题

50

帖子

1

精华

中级会员

Rank: 3Rank: 3

积分
321
金钱
321
注册时间
2014-10-29
在线时间
37 小时
发表于 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#楼]

可以编译看编译器的报错结果
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

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

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2024-11-1 08:36

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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