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

#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

最佳答案

为什么不先把pnode定义为void*
你问题的答案是这样的:

freenode = freenode + NODESIZE;

它在freenode上执行指针运算,这在void*上是禁止的。
回想一下,向指针adkus添加一个整数N将通过sizeof(*pointer) * N来设置地址当指针为char *时,sizeof(*pointer)等于1,因此地址向前移动NODESIZE当指针为void*时,sizeof(*pointer)未定义,将导致编译错误。

关于c - “Programming Pearls”一书中的“pmalloc”代码,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/36821549/

10-11 03:01