目录
memcpy函数
从源位置(source)复制num个字节的数据到目标位置(destination)
注意:
此函数在遇到 ' \0 ' 并不会停下来
此函数只适用于不重叠内存的拷贝,而若要拷贝重叠的内容则要用到memmove(一般来说)
应用举例
int main()
{
char arr1[8] = { 0 };
char arr2[] = "hello";
printf("%s", memcpy(arr1, arr2, 6));
return 0;
}
模拟实现
void* my_memcpy(void* dest, const void* src, size_t sz)
{
void* ret = dest;
//为了让所有了类型都适用,所以返回void*类型
assert(dest && src);//保证dest和src不为0,注意引用头文件assert.h
while (sz--)
{
*(char*)dest = *(char*)src;
dest = (char*)dest + 1;
//注意此处不能用(char*)dest++代替,因为是先++再解引用的
//也不能用++(char*)dest,可能会出现无法编译的问题
src = (char*)src + 1;
}
return ret;
}
memmove函数
类似于memcpy,可用于重叠内存的拷贝
应用实例
int main()
{
int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
//1 2 1 2 3 4 5 8 9 10
memmove(arr+2, arr, 20);
return 0;
}
模拟实现
按dest和src的相对位置来区分拷贝的顺序
void* my_memmove(void* dest, const void* src, size_t sz)
{
assert(dest && src);
void* ret = dest;
if (dest < src)
{
//前->后
int i = 0;
for (i = 0; i < sz; i++)
{
*(char*)dest = *(char*)src;
dest = (char*)dest + 1;
src = (char*)src + 1;
}
}
else
{
//后->前
while (sz--)
{
*((char*)dest+sz) = *((char*)src + sz);
}
}
return ret;
}
memcmp函数
比较两个内存中数据的大小
注意:
此函数比较类似于strcmp,前者大返回大于0的值,后者大返回小于0的值,相等返回0
此函数不会以' \0 '作为结束,而是以自定义的num字节数为比较范围(可用sizeof计算)
应用实例
int main ()
{
char buffer1[] = "DWgaOtP12df0";
char buffer2[] = "DWGAOTP12DF0";
int n;
n=memcmp ( buffer1, buffer2, sizeof(buffer1) );
if (n>0)
printf ("'%s' is greater than '%s'.\n",buffer1,buffer2);
else if (n<0)
printf ("'%s' is less than '%s'.\n",buffer1,buffer2);
else
printf ("'%s' is the same as '%s'.\n",buffer1,buffer2);
return 0;
}
memset函数
以字节为单位设置内存
应用实例
int main()
{
char arr[] = "hello world";
memset(arr+6, 'x', 3);
printf("%s\n", arr);
return 0;
}
输出结果:hello xxxld
*截图来自于cplusplus.com