calloc()函数而不是malloc()函数
我想将calloc()函数而不是malloc()函数,c,malloc,calloc,C,Malloc,Calloc,我想将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++
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;
}
void*mymalloc(尺寸长度)
{
无效*buf;
页面大小=(透镜和页面遮罩)+2;
大小偏移量=页面大小-(透镜和页面掩码);
如果(偏移量<尺寸f(尺寸t))
{
网页++;
偏移量+=页面大小;
}
如果((buf=mmap)(NULL,pagescalloc()
实际上就是malloc()
,且memset()
为零
假设您需要一个mycalloc()
来补充您的mymalloc()
:
你会得到:
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()
添加乘法溢出和空返回检查当您遇到类似问题时,请始终检查手册页面:
- 马洛克:
void*malloc(size\u t size);
malloc()函数分配大小字节并返回指向
分配的内存。内存未初始化。如果大小为0,
然后malloc()返回NULL或唯一的指针值,该值可以
稍后将成功传递给free()
- 卡洛克:
void*calloc(size\t nmemb,size\t size);
calloc()函数
为大小为字节和的nmemb元素数组分配内存
返回指向已分配内存的指针。内存设置为
如果nmemb或size为0,则calloc()返回NULL或
以后可以成功传递给free()的唯一指针值
不同之处在于,calloc还将分配的内存块初始化为零。现在的代码中没有malloc()
。你在问什么?那里没有malloc()
;只有一个mymalloc()
。大概你想要一个调用mymalloc()的mycalloc()
然后将空格归零。还必须考虑malloc()
使用一个参数和calloc()
取两个必须相乘才能产生所需大小的结果。第一个google结果您忘记了确保乘法不会溢出。@重复数据消除程序我想留下一些东西让OP来解决…[不,我没有忘记。;-]如果您的目标环境是Linux,您甚至不需要memset,MAP_匿名页面将归零。@johnascall True。这确实使mycalloc()
实现依赖于mymalloc()
返回归零内存。是的,我的评论主要是旁白。如果你真的想这样做,你最好在内存集
周围加上一个特性测试宏,比如\ifndef\u HAVE\u zeroning\u ano\MMAP
注意:第二个区别,今天很少看到,是calloc()
可以像calloc(SIZE\u MAX/8,16)
那样处理分配,而malloc()
不能。在分段体系结构上很有用。
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 );
}