在c中创建我自己的memset函数

Sax*_*owl 1 c memory pointers memset pointer-arithmetic

这是原型:

void *memset(void *s, int c, size_t n)
Run Code Online (Sandbox Code Playgroud)

首先我不确定我是否必须返回一些东西,因为当我使用memset时,例如

memset(str, 'a', 5);
Run Code Online (Sandbox Code Playgroud)

代替

str = memset(str, 'a', 5);
Run Code Online (Sandbox Code Playgroud)

这是我的代码所在:

void *my_memset(void *b, int c, int len)
{
    int i;

    i = 0;
    while(b && len > 0)
    {
        b = c;
        b++;
        len--;
    }
    return(b);
}

int main()
{
    char *str;

    str = strdup("hello");
    my_memset(str, 'a', 5);
    printf("%s\n", str);
}
Run Code Online (Sandbox Code Playgroud)

我不想在这个函数中使用数组,以更好地理解指针和内存,所以我没有得到2件事: - 如何将int c复制到我的void b指针上的一个字符 - 我要用什么条件来确定它在'\ 0'字符之前停止

编辑:我想知道有没有办法在没有投射的情况下执行此功能?

nos*_*nos 7

如何将int c复制到我的void b指针上的字符中

您将void指针转换为unsigned char指针:

void  *my_memset(void *b, int c, int len)
{
  int           i;
  unsigned char *p = b;
  i = 0;
  while(len > 0)
    {
      *p = c;
      p++;
      len--;
    }
  return(b);
}
Run Code Online (Sandbox Code Playgroud)

我要用什么条件来确保它在'\ 0'字符之前停止

memset必须信任传入的长度.memset需要处理一般的内存,而不仅仅是一个0终止的字符串 - 所以不应该进行这样的检查.

如果你反正需要检查一个0字节.你做的

if (*p == 0) //or if(!*p )
     break;
Run Code Online (Sandbox Code Playgroud)