如何解决Calloc实现
我制作了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,nmemb * size);
return (s);
}
我不明白为什么在nmemb
函数中将size
和ft_calloc
相乘。
示例:
在(ft_calloc) nmemb = 5
和size = 4
,(ft_memset) size_t n = (5 * 4)
中,
变量i
将在while
循环中过度增加,而我需要在数组的第5个元素(nmemb
)处停止。这是正确的吗?
解决方法
我不明白为什么在
nmemb
函数中将size
和ft_calloc
相乘
因为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
,这意味着如果使用类型为{{1}的指针}进行迭代,您将需要进行unsigned char *
个迭代。代码正确。
注意:如@chux在评论中所述,您应在调用20
之前在ft_calloc()
中检查是否溢出。如果malloc()
太大,则使函数失败:
nmemb * size
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。