Sof*_*rtz 2 c char memset void-pointers function-definition
在尝试重新创建“memset”函数时,如果我尝试取消引用 void 指针,或者第二个参数的类型与第一个参数的类型不同,则会出错。为了使该功能正常工作,我必须将其更改为:
void ft_memset(unsigned char *st, unsigned char c, size_t n)
Run Code Online (Sandbox Code Playgroud)
是否可以像手册中那样定义该功能?
void *memset(void *s, int c, size_t n) <- This is the man version.
Run Code Online (Sandbox Code Playgroud)
我只使用库 stdio.h 来使用 size_t 我必须使用 -Wall -Wextra -Werror 进行编译
这是我的代码:
#include <stdio.h>
//stdio.h to use size_t;
//
void *ft_memset(unsigned char *str, unsigned char c, size_t n)
{
unsigned int i;
i = 0;
while (i < n)
{
str[i] = c;
i++;
}
return(str);
}
Run Code Online (Sandbox Code Playgroud)
该类型void为不完整类型。您不能取消引用 类型的指针void *。
来自 C 标准(6.2.5 类型)
19 void 类型包含一组空值;它是一个不完整的对象类型,无法完成。
在函数中,您只需在使用循环之前将类型指针强制转换void *为类型。unsigned char *
注意标准C函数的第二个参数memset是int。
void *memset(void *s, int c, size_t n);
Run Code Online (Sandbox Code Playgroud)
unsigned int您所使用的充当索引角色的对象的类型i通常也是错误的。
unsigned int i;
Run Code Online (Sandbox Code Playgroud)
该类型unsigned int可能不够大,无法存储该类型的所有值size_t。结果你可以得到一个无限的 while 循环。
该函数可以通过以下方式定义
void * memset( void *s, int c, size_t n )
{
for ( unsigned char *p = s, ch = c; n != 0; n-- )
{
*p++ = ch;
}
return s;
}
Run Code Online (Sandbox Code Playgroud)