我想malloc()
函数更改为calloc()
,但我很困惑:如何在这段代码中做到这一点?
void *mymalloc(size_t len)
{
void *buf;
size_t pages = (len & PAGE_MASK) + 2;
size_t offset = PAGE_SIZE - (len & ~PAGE_MASK);
if(offset < sizeof(size_t))
{
pages++;
offset += PAGE_SIZE;
}
if((buf = mmap(NULL, pages << PAGE_SHIFT, PROT_READ | PROT_WRITE,
MAP_PRIVATE | MAP_ANONYMOUS, 0, 0)) == -1)
{
perror("mymalloc/mmap");
exit(1);
}
*(size_t *)buf = len;
*(size_t *)(buf+offset+len) = len;
if(mprotect(buf+offset+len, PAGE_SIZE, PROT_NONE) == -1)
{
perror("mymalloc/mprotect");
exit(1);
}
return buf+offset;
}
calloc()
实际上只是malloc()
,memset()
为零。
假设你想要一个mycalloc()
来补充你的mymalloc()
:
void *mymalloc( size_t bytes )
{
...
return( ptr );
}
你会得到:
void *mycalloc( size_t bytes, size_t n )
{
size_t total_bytes = bytes * n;
void *ptr = mymalloc( total_bytes );
memset( ptr, 0, total_bytes );
return( ptr );
}
您需要添加对乘法溢出和 NULL 从 mymalloc()
返回的检查。
当您遇到这样的问题时,请务必查看手册页:
- 马洛克:
void *malloc(size_t size);
malloc() 函数分配大小字节并返回指向 分配的内存。 内存未初始化。 如果大小为 0, 则 malloc() 返回 NULL 或唯一指针值,该值可以 稍后成功传递给 free()。
- 卡洛克:
void *calloc(size_t nmemb, size_t size);
calloc() 函数 为每个大小为字节的 nmemb 元素数组分配内存,并且 返回指向已分配内存的指针。 内存设置为 零。 如果 nmemb 或大小为 0,则 calloc() 返回 NULL 或 以后可以成功传递给 free() 的唯一指针值。
不同之处在于 calloc 还将分配的内存块初始化为零。