我得到了一个解决方案,在C编程中重新创建函数strlen的问题,它是如下所示的,我需要帮助来理解代码实际上在做什么。
void *ft_memset(void *b, int c, size_t len)
{
size_t i;
i = 0;
while (i < len)
{
((unsigned char *)b)[i] = c;
i++;
}
return (b);
}
我最大的疑问是((unsigned char *)b)[i] = c
的含义,特别是因为我不理解( *)b
,以及在void
函数中需要返回b
。
非常感谢您的帮助,对不起,如果我做错了什么,这是我的第一篇文章堆栈溢出。
2条答案
按热度按时间nzk0hqpo1#
让我们把它分解一下,尽管我的C语言技能有些生疏了。欢迎编辑:)
首先,声明了一个名为
ft_memset
的函数,该函数返回void *
。void *
意味着指向任何对象的指针。它只是一个数字,指向一个内存地址。但是我们不知道里面有什么,因为它没有被正确地注解。您的函数接受三个参数:
b
,它是指向 anything 的指针(如果愿意,也可以是void指针)c
,它是int
32位有符号整数。len
,它是size_t
,通常是无符号整数的别名。Read more aboutsize_t
over here您的函数迭代
len
的前几个字节,并将c
的值设置为这些字节。我们基本上覆盖了
b
的第一个len
字节内容。现在,
((unsigned char*)b)
是什么意思,这个语句是把你的void *
转换成一个unsigned char*
(字节指针),这只是告诉编译器我们要处理b
所指向的内容,就好像它们只是一个unsigned char
一样。稍后我们只对第
i
个位置进行索引,并在其中设置值c
。ijnw1ujt2#
理解函数strlen的代码
void *ft_memset(void *b, int c, size_t len)
类似于void *memset(void *s, int c, size_t n)
,它们都为b
指向的内存赋值,这些函数与strlen()
有很大不同。size_t strlen(const char *s)
不会改变s
指向的内存。它会遍历该内存以查找 * 空字符 *。