微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Calloc实现

如何解决Calloc实现

我制作了ft_callocft_memset,它们都可以工作,但是我不明白为什么。

void *ft_memset(void *s,int c,size_t n)
{
        size_t i;
        unsigned char *p;

        i = 0;
        p = (unsigned char *)s;
        while (i < n)
        {
                p[i] = (unsigned char)c;
                i++;
        }
        return ((void*)p);
}

void *ft_calloc(size_t nmemb,size_t size)
{
        void *s;

        if (!(s = malloc(size * nmemb)))
                return (NULL);
        s = ft_memset(s,nmemb * size);
        return (s);
}

我不明白为什么在nmemb函数中将sizeft_calloc相乘。

示例:

(ft_calloc) nmemb = 5size = 4(ft_memset) size_t n = (5 * 4)中, 变量i将在while循环中过度增加,而我需要在数组的第5个元素(nmemb)处停止。这是正确的吗?

解决方法

我不明白为什么在nmemb函数中将sizeft_calloc相乘

因为ft_memset在字节级别上进行操作,所以将每个字节设置为给定值。如果您有每个nmemb个字节的size个元素,则字节总数为nmemb * size

(ft_calloc)nmemb = 5size = 4(ft_memset) size_t n = (5 * 4)中, 变量iwhile循环中将过度增加

不,不会。您正在遍历unsigned char *。即,每个元素是一个字节。由于在ft_calloc中有5个成员,每个成员的大小为4个字节,因此字节总数为5 * 4 == 20,这意味着如果使用类型为{{1}的指针}进行迭代,您将需要进行unsigned char *个迭代。代码正确。


注意:如@chux在评论中所述,您应在调用20之前在ft_calloc() 中检查是否溢出。如果malloc()太大,则使函数失败:

nmemb * size

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。