【问题标题】:Calloc implementationCalloc 实现
【发布时间】:2020-10-19 13:38:06
【问题描述】:

我做了一个ft_calloc 和ft_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, 0, nmemb * size);
        return (s);
}

我不明白为什么要在 ft_calloc 函数中乘以 nmemb 和 size。

例子:

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

【问题讨论】:

  • 不确定我是否理解您的问题,您正在调用 5 个元素,每个元素 4 个字节,总共 20 个字节。循环中的i 从 0 到 19,即 20 个字节,您为循环中的每个字节分配 c 的值
  • 旁白:健壮的代码可以防止malloc() 和if (size &amp;&amp; SIZE_MAX/size &gt; nmemb) return NULL; 之前的溢出
  • @chux-ReinstateMonica 已经被 malloc 覆盖了,不是吗?
  • @MarcoBonelli 否。malloc(n) 不可能知道 nmemb*size 在形成 n 时是否溢出。顺便说一句:第二次测试应该是SIZE_MAX/size &lt; nmemb。
  • @chux-ReinstateMonica 啊,你说得对。我在想calloc()。

标签: c memory calloc memset


【解决方案1】:

我不明白为什么要在 ft_calloc 函数中乘以 nmemb 和 size

因为ft_memset 在字节级别运行,将每个字节设置为给定值。如果每个 nmemb 元素有 size 字节,则总字节数为 nmemb * size。

在(ft_calloc)nmemb = 5 和size = 4, (ft_memset) size_t n = (5 * 4), 变量i 将在while 循环中过度递增

不,它不会。您正在迭代 unsigned char *。也就是说,每个元素都是一个字节。因为在ft_calloc 中有5 成员,每个成员大小为4 字节,总字节数为5 * 4 == 20,这意味着如果您使用unsigned char * 类型的指针进行迭代,您将需要执行@987654340 @ 迭代。代码是正确的。


注意:正如 cmets 中的 @chux 所述,您应该在调用 malloc() 之前检查您的 ft_calloc() 是否有溢出 并让函数失败以防万一nmemb * size 太大了:

if (size && SIZE_MAX/size < nmemb)
    return NULL;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-05-02
    • 1970-01-01
    • 2010-10-04
    • 1970-01-01
    • 2012-03-02
    • 2015-06-30
    • 2021-11-12
    相关资源
    最近更新 更多