C - calloc() 函数而不是 malloc()



我想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 还将分配的内存块初始化为零。

相关内容

  • 没有找到相关文章

最新更新