【发布时间】: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 && SIZE_MAX/size > nmemb) return NULL;之前的溢出 -
@chux-ReinstateMonica 已经被
malloc覆盖了,不是吗? -
@MarcoBonelli 否。
malloc(n)不可能知道nmemb*size在形成n时是否溢出。顺便说一句:第二次测试应该是SIZE_MAX/size < nmemb。 -
@chux-ReinstateMonica 啊,你说得对。我在想
calloc()。