当我看到这本书上的解决方案时,我有点困惑:
#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/