Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/vim/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
calloc()函数而不是malloc()函数_C_Malloc_Calloc - Fatal编程技术网

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,pages
calloc()
实际上就是
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 );
}