1.memcpy使用和模拟实现
函数memcpy从source的位置开始向后复制num个字节的数据到destination指定的内存位置。
这个函数在遇到‘\0’的时候并不会停下来
如果source和destination有任何的重叠,复制的结果都是未定义的。
int main()
{
int arr1[] = { 1,2,3,4,5,6,7,8,9,10 };
int arr2[10] = { 0 };
memcpy(arr2, arr1, 20);
int i = 0;
for (i = 0; i < 10; i++)
{
printf("%d\n", arr2[i]);
}
return 0;
}
多余的空间用0补齐
重叠的情况:
arr+2:首元素地址向后移动两个元素,3,4会被1,2覆盖
int arr1[] = { 1,2,3,4,5,6,7,8,9,10 };
memcpy(arr1+2, arr1, 20);
int i = 0;
for (i = 0; i < 10; i++)
{
printf("%d\n", arr1[i]);
}
对于重叠的内存,交给memmove来处理
memcpy函数的模拟实现
memcpy函数拷贝结束之后,会返回目标空间的起始地址
void*的指针什么地址都能接收
void* memcpy(void* dst, const void* src, size_t count)
{
void* ret = dst;//先将dst存起来
assert(dst && src);
while (count--)
{
*(char*)dst = *(char*)src;
dst = (char*)dst + 1;//对指针进行解引用,不同的指针每次加减的步长不同
src = (char*)src + 1;//不能写成src++,dst++,也不能写成(char*)src++,强转为临时强转
//void*不能直接解引用,要使src,dst向后访问一个字节,用char*类型的指针解引用
}
return(ret);//不能直接返回dst,他不是原来的地址了
}
2,memmove使用和模拟实现
和memcpy的差别就是memmove函数处理的原内存块和目标内存块是可以重叠的
如果原空间和目标空间出现重叠,就得使用memmove函数处理
int main()
{
int arr1[] = { 1,2,3,4,5,6,7,8,9,10 };
memmove(arr1 + 2, arr1, 20);//5*sizeof(int)
int i = 0;
for (i = 0; i < 10; i++)
{
printf("%d\n", arr1[i]);
}
return 0;
}
该代码的意思:将1~5的数,拷贝到3~7的位置,会出现覆盖的情况,3,4会被1,2覆盖
问题的解决方法:1,可再搞一个数组,复制原来的数(1~10),再将(1~5)放到(3~7)的位置,再将得到的数拷贝放回去(有点浪费时间)
2,可以倒着放入数据
1,2 | 3,4,5,6,7 | 8.9.10 |
memmove的模拟实现
void* memmove(void* dst, const void* src, size_t count)
{
void* ret = dst;
if (dst <= src || (char*)dst >= ((char*)src + count))
{
while (count--)
{
*(char*)dst = *(char*)src;
dst = (char*)dst + 1;//对指针进行解引用,不同的指针每次加减的步长不同
src = (char*)src + 1;//不能写成src++,dst++,也不能写成(char*)src++,强转为临时强转
}
}
else
{
dst = (char*)dst + count - 1;
src = (char*)src + count - 1;
while (count--)
{
*(char*)dst = *(char*)src;
dst = (char*)dst - 1;
src = (char*)src - 1;
}
}
return(ret);
}
3,memset函数的使用
memset是用来设置内存的,将内存中的值以字节为单位设置成想要的内容
int main()
{
char str[] = "hello world!";
memset(str, 'x', 6);//6单位字节
printf(str);
return 0;
}
4.memcmp函数的使用
memcmp函数内存块的比较函数
任何系列都能比较
比较从buf1和buf2指针指向的位置开始,向后的count个字节
返回值
int main()
{
char buffer1[] = "DWgaotp12f0";
char buffer2[] = "DEGAOTP12DF0";
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;
}