memset 函数的正确类型是什么?

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)

Vla*_*cow 5

该类型void为不完整类型。您不能取消引用 类型的指针void *

来自 C 标准(6.2.5 类型)

19 void 类型包含一组空值;它是一个不完整的对象类型,无法完成。

在函数中,您只需在使用循环之前将类型指针强制转换void *为类型。unsigned char *

注意标准C函数的第二个参数memsetint

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)