gpt4 book ai didi

calloc() 函数代替 malloc()

转载 作者:行者123 更新时间:2023-11-30 21:35:23 26 4
gpt4 key购买 nike

我要改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 );
}

您需要添加对乘法溢出和 mymalloc() 返回 NULL 的检查。

关于calloc() 函数代替 malloc(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35093724/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com