memmove函数
memmove函数的实现
void * memmove ( void * destination, const void * source, size_t num );
#include<string.h>
#include<stdio.h>
void* my_memmove(void* dest,const void* src,int count)
{
void* ret=dest;
if(dest<src ||(char*)dest>(char*)src+count)
{
while(count--)
{
*(char*)dest=*(char*)src;
++(char*)dest;
++(char*)src;
}
}
else
{
while(count--)
{
*((char*)dest+count)=*((char*)src+count);
}//第一种方法
}
/*if(dest<src)
{
while(count--)
{
*(char*)dest=*(char*)src;
++(char*)dest;
++(char*)src;
}
}
else if(dest>src)
{
while(count--)
{
*((char*)dest+count)=*((char*)src+count);
}
}*/
//第二种方法
return ret;
}
int main()
{
int arr[]={1,2,3,4,5,6,7,8,9,10};
int i=0;
memmove(arr+2,arr,20);
for(i=0;i<10;i++)
{
printf("%d ",arr[i]);
}
return 0;
}//编译结果1 2 1 2 3 4 5 8 9 10
注意事项
1、和memcpy的差别就是memmove函数处理的源内存块和目标内存块是可以重叠的。但在vs编译器中,memcpy和memmove这两个函数的实现功能是相同的
2、如果源空间和目标空间出现重叠,就得使用memmove函数处理。
memcmp函数
#include<stdio.h>
#include<string.h>
int main()
{
int arr1[]={1,2,3,4,5,6};
int arr2[]={1,2,4,5,6};
int ret=memcmp(arr1,arr2,9);
printf("%d\n",ret);
return 0;
}
//编译结果:-1
注意事项
arr1<arr2:返回负数
arr1>arr2:返回正数
arr1=arr2:返回0
menset函数
#include<stdio.h>
#include<string.h>
int main()
{
char arr[10]={0};
int i;
memset(arr,'#',10);
for(i=0;i<10;i++)
{
printf("%c ",arr[i]);
}
return 0;
}
编译结果:# # # # # # # # # # 请按任意键继续. . .
注意事项
#include<stdio.h>
#include<string.h>
int main()
{
int arr[10]={0};
int i;
memset(arr,'1',10);
for(i=0;i<10;i++)
{
printf("%d ",arr[i]);
}
return 0;
}
编译结果:16843009 16843009 257 0 0 0 0 0 0 0 请按任意键继续. . .
memsert(arr,1,10)
其中10是字节数
00 00 00 00 00 00 00 00 00 00 00 00 00 00 前三个字节
经过memsert函数之后,变成
01 01 01 01 01 01 01 01 01 01 00 00 即为
16843009 16843009 257 0 0 0 0 0 0 0 请按任意键继续. . .