免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1291 | 回复: 6
打印 上一主题 下一主题

新手ff1982问一个很菜的问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2005-12-12 10:50 |只看该作者 |倒序浏览
//实现内存分配功能
void * Mallocmem(int piMemLen)
{
        ListNode *tmp = NULL;
        void *ptr = NULL;

        int iChoose = 0;

        if(piMemLen > BLOCK*MAXNUM)
        {
                ptr = malloc(piMemLen+2);
                *(char*)ptr = MAXNUM;/*这一句是什么意思啊?为什么给*(char*)ptr重复赋值?*(char*)ptr的内存指针不是malloc(piMemLen+2)吗?要是再一重复赋值,那malloc函数分配的内存地址不就不存在ptr里了吗?(char*)ptr已经是一个指针了,*(char*)ptr是什么意思?是在(char*)ptr指针的基础上再重复赋值吗?*/
                return (void*)((char*)ptr+2);//这里+2是什么意思啊?加与不加2有什么区别?
        }


原代码如下:

//数据结构
#include "Proxy.h"
#include "Ex_Socket.h"

#define BLOCK 1024
#define MAXNUM 8

struct ListNode
{
        void *ptr;
        struct ListNode *next;
};

ListNode lstMemRoot[MAXNUM];
ListNode lstNodeBuff;
CRITICAL_SECTION cs;

//初始化内存池
void InitializeMemPool()
{
        InitializeCriticalSection(&cs);

        if(DEBUG)
        {
                Log("初始化临界段");
        }

        #ifdef _DEBUG
                Log("初始化临界段");
        #endif

        for(int i=0;i<MAXNUM;i++)
        {
                lstMemRoot.ptr=NULL;
                lstMemRoot.next=NULL;
        }

        lstNodeBuff.ptr=NULL;
        lstNodeBuff.next=NULL;
}

//实现内存分配功能
void * Mallocmem(int piMemLen)
{
        ListNode *tmp = NULL;
        void *ptr = NULL;

        int iChoose = 0;

        if(piMemLen > BLOCK*MAXNUM)
        {
                ptr = malloc(piMemLen+2);
                *(char*)ptr = MAXNUM;
                return (void*)((char*)ptr+2);
        }

        iChoose = (piMemLen-1)/BLOCK;

        if(lstMemRoot[iChoose].next == NULL)
        {
                ptr = malloc(piMemLen+2);
                *((char*)ptr) = iChoose;
                return (void*)((char*)ptr+2);
        }
        else
        {
                EnterCriticalSection(&cs);
                /*if(DEBUG)
                {
                        Log("进入临界段");
                }*/

                tmp = lstMemRoot[iChoose].next;

                lstMemRoot[iChoose].next = tmp->next;

                tmp->next = lstNodeBuff.next;
                lstNodeBuff.next = tmp;

                /*if(DEBUG)
                {
                        Log("退出临界段");
                }*/
                #ifdef _DEBUG
                Log("初始化临界段");
#endif
                LeaveCriticalSection(&cs);

                return tmp->ptr;
        }
        return 0;
}

//实现内存释放功能
void FreeMem(void *pMemPtr)
{
        ListNode *tmp = NULL;
        int iChoose = 0;
        iChoose = *((char*)pMemPtr - 2);

        if(iChoose > MAXNUM-1)
        {
                free((char*)pMemPtr-2);
                return;
        }

        EnterCriticalSection(&cs);
        if(DEBUG)
        {
                Log("进入临界段");
        }

        if(lstNodeBuff == NULL)
        {
                tmp = (LstNode*)malloc(sizeof(ListNode));
                tmp->ptr = NULL;
                tmp->next = NULL;
        }
        else
        {
                tmp = lstNodeBuff.next;
                tmp->ptr = NULL;
                tmp->next = lstNodeBuff.next->next;

                lstNodeBuff.next = tmp.next->next;
        }

        tmp->next = lstMemRoot[iChoose].next;
        tmp->ptr = pMemPtr;
        lstMemRoot[iChoose].next = tmp;

        if(DEBUG)
        {
                Log("退出临界段");
        }
        LeaveCriticalSection(&cs);
}

论坛徽章:
0
2 [报告]
发表于 2005-12-12 10:56 |只看该作者
malloc返回的不是数字,而是一个地址。
*ptr就是该地址指向的内存。 (char *)是把ptr强制转换为char *型的

论坛徽章:
0
3 [报告]
发表于 2005-12-12 11:04 |只看该作者
额外分配两个字节空间用以存放你申请空间大小

论坛徽章:
0
4 [报告]
发表于 2005-12-12 13:06 |只看该作者
原帖由 albcamus 于 2005-12-12 10:56 发表
malloc返回的不是数字,而是一个地址。
*ptr就是该地址指向的内存。 (char *)是把ptr强制转换为char *型的

不好意思,我没说明白,我的意思是:
return (void*)((char*)ptr+2);//这里+2是什么意思啊?加与不加2有什么区别?
既然(char*)ptr是内存指针,那(char*)ptr+2是什么意思?是(char*)ptr内存地址的第三个地址吗?

论坛徽章:
0
5 [报告]
发表于 2005-12-12 14:47 |只看该作者
ptr = malloc(piMemLen+2);
    ptr存储的是malloc分配的内存地址
*(char*)ptr = MAXNUM
    把maxnum这个值存在这个地址里,也就是存在了malloc分配的那里
return (void*)((char*)ptr+2);
    抛开强制类型转换不看,很容易看出返回的是ptr+2这个地址

论坛徽章:
0
6 [报告]
发表于 2005-12-12 15:46 |只看该作者

谢谢

原帖由 暗底 于 2005-12-12 14:47 发表
ptr = malloc(piMemLen+2);
    ptr存储的是malloc分配的内存地址
*(char*)ptr = MAXNUM
    把maxnum这个值存在这个地址里,也就是存在了malloc分配的那里
return (void*)((char*)ptr+2);
    抛开强制类型转 ...


谢谢你啊,经你这么一指点.我很有矛塞顿开的感觉.

论坛徽章:
0
7 [报告]
发表于 2005-12-12 16:03 |只看该作者

回复 1楼 ff1982 的帖子

还有一个问题困绕我一直想不明白:希望高手不赐指点----
为什么它判断该接点是否被分配不用if(lstMemRoot[iChoose].ptr == NULL)

而用if(lstMemRoot[iChoose].next == NULL)?

lstMemRoot[iChoose].next 不是指到它的下一接点去了吗?
但这里是判断lstMemRoot[iChoose]接点是否已经分配啊!
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP