目录
一、memset:内存初始化函数
void *memset(void *dest, int c, size_t count);
dest : 一块空间的起始地址
c: 对这块空间中每个字节要初始化的数据
count: 从dest起始地址开始,要设置多少字节的空间
返回值: 返回dest空间首地址
代码思路:
这个函数的实现很简单,根据开始时所输入的数据类型,在dest之前将他强转为相应所需要的类型,简单的for循环即可
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<assert.h>
void *mymemset(void *dest, int c, size_t count)
{
for (int i = 0; i < count; i++)
{
*(((char*)dest + i)) = c;
}
return dest;
}
int main()
{
char string[] = "A sting\tof,,tokens\nand some more tokend";
mymemset(string, 0, sizeof(string));
system("pause");
return 0;
}
调试结果由上图可知,进过mymemset函数,将字符串的内存改为0
二、memcpy:内存拷贝函数
void *memcpy(void *dest, const void *src, size_t count);
功能:从src指向的空间中拷贝count字节的数据到dest空间中
dest :目标空间
src:源数据空间
count:大小
返回值:返回dest空间首地址
如果在复制中,源与目标重叠,此函数无法保证在覆盖之前复制重叠区域中的原始字节,要使用memmove函数
void *mymemcpy(void *dest, const void *src, size_t count)
{
assert(dest != NULL && src != NULL);
char *d = (char*)dest;
char *e = (char*)src;
while (count--)
{
*d = *e;
d++;
e++;
}
return dest;
}
int main()
{
char string[] = "A sting\0tof,,tokens\nand some more tokend";
char buff[1024] = { 0 };
mymemcpy(buff, string, sizeof(string));
system("pause");
return 0;
}
buff内存空间均为0
运行mymemcpy函数,成功将string拷贝进来,为了加以区别,我们在string中加入\0
当strcpy函数遇到\0时,会停止,而我们这个函数不受\0的影响,从上面内存也可以看出,00之后继续拷贝
三、memmove函数的实现
void * memmove ( void * dst, const void * src, size_t count);
如果在复制中,源与目标重叠,要在覆盖之前复制重叠区域中的原始字节,要使用memmove函数
void *mymemmove(void * dest, const void * src, size_t count)
{
assert(dest != NULL && src != NULL);
char *d = (char*)dest;
char *s = (char*)src;
if ((d > s) && ((s + count) > d))
{
d = d + count - 1;
s = s + count - 1;
while (count > 0)
{
*(s) = *(d);
d--;
s--;
count--;
}
}
else
{
while (count > 0)
{
*d = *s;
d++;
s++;
count--;
}
}
return dest;
}
int main()
{
char string[] = "A sting\0tof,,tokens\nand some more tokend";
mymemmove(string + 5, string, sizeof(string));
printf("%s\n", string);
system("pause");
return 0;
}