当我看到本书的解决方案时,我有点困惑:
#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
?
答案 0 :(得分:2)
为什么不首先将
pnode
定义为void*
?
你的问题的答案就在这一行:
freenode = freenode + NODESIZE;
它会对freenode
上的指针算术进行操作,void*
上禁止这样做。
回想一下,向指针添加整数N
会使地址加sizeof(*pointer) * N
。当指针为char *
时,sizeof(*pointer)
等于1,因此地址向前移动NODESIZE
。当指针为void*
时,未定义sizeof(*pointer)
,并导致编译错误。