“珍珠编程”一书中的“pmalloc”代码

时间:2016-04-24 09:45:44

标签: c malloc

当我看到本书的解决方案时,我有点困惑:

#define NODESIZE 8
#define NODESGROUP 100
int leftnodes = 0;
char *freenode;
void *pmalloc(int size)
{
    void *p;
    if (size != NODESIZE)
        return malloc(size);
    if (leftnodes == 0)
    {
        freenode = malloc(NODESGROUP * NODESIZE);
        leftnodes = NODESGROUP;
    }
    leftnodes--;
    p = (void *)freenode;
    freenode = freenode + NODESIZE;
    return p;
}

上面的代码旨在同时malloc一块空间,并减少过多使用malloc()的机会。

为什么需要先使用char *freenode然后将其更改为void*?为什么不将其定义为void * first

1 个答案:

答案 0 :(得分:2)

  

为什么不首先将pnode定义为void*

你的问题的答案就在这一行:

freenode = freenode + NODESIZE;

它会对freenode上的指针算术进行操作,void*上禁止这样做。

回想一下,向指针添加整数N会使地址加sizeof(*pointer) * N。当指针为char *时,sizeof(*pointer)等于1,因此地址向前移动NODESIZE。当指针为void*时,未定义sizeof(*pointer),并导致编译错误。