二维指针*(void **)的研究(uC/OS-II案例)
了把所指向的地址的内容转换成一个指针。
二、在OSMemGet( )函数内同样有一条强制转换为二维指针的指令:
void *pblk;
执行操作:pmem->OSMemFreeList =*(void **)pblk;
pblk被强制转换为二维指针,然后取出其内容*pblk,也就是pblk地址内存放的链接指针。
意味着取出pblk的内容,由于pblk被强制转换成了二维指针,所以它的内容就不是一般的值,而是一个指针(这个指针指向下一个Block首地址)。
三、在INT8U OSMemPut (OS_MEM *pmem, void *pblk) 函数内同样有类似的指令:
① *(void **)pblk = pmem->OSMemFreeList; // 将欲释放的块添加到空闲块链表最前面
② pmem->OSMemFreeList = pblk;
首先要明白pmem->OSMemFreeList是指向空闲块链表第一个block的首地址的。
语句①将pblk强制转换为二维指针后,再将pmem->OSMemFreeList赋值给pblk的内容(*pblk指针)。根据OSMemPut函数的定义,pblk是函数的形参,是欲释放的块的首地址。所以也就是将pmem->OSMemFreeList指针放入欲释放的块的首地址内,此处强制转换为二维指针的目的就是让欲释放的块的首地址内能存放指针。则这个块的首地址内的指针就是指向原先空闲块链表第一个Block的首地址的,也就是说这个块变成了空闲块链表第一个Block,实现了将释放的块添加到空闲块链表最前面的目的。
然后语句②更新pmem->OSMemFreeList指针,使其指向新释放的块的首地址,这样就保证了pmem->OSMemFreeList始终指向空闲块链表第一个Block首地址。
- Windows CE 进程、线程和内存管理(11-09)
- RedHatLinux新手入门教程(5)(11-12)
- uClinux介绍(11-09)
- openwebmailV1.60安装教学(11-12)
- Linux嵌入式系统开发平台选型探讨(11-09)
- Windows CE 进程、线程和内存管理(二)(11-09)