内存操作函数
memcpy——内存拷贝函数一
以下是cplusplus上面对memcpy的介绍:
翻译如下(不过小伙伴们最好还是看英文更好)
memcpy的使用以及模拟实现。
#include<stdio.h>
#include<string.h>
void my_memcpy(void* dest, const void* src, size_t sum)
{
void* ret=dest;
while (sum--)
{
*(char*)dest = *(char*)src;
dest=(char*)dest + 1;
src = (char*)src + 1;
}
//无法使用(char*)dest++
return ret;
}
int main()
{
int arr1[10] = { 1,2,3,4,5,6,7,8,9,10 };
int arr2[10] = { 0 };
my_memcpy(arr2, arr1, 20);
for (int i = 0; i < 10; i++)
{
printf("%d ",arr2[i]);
}
return 0;
}
当自己给自己拷贝时,可能会有拷贝重叠的现象导致拷贝不下去。
这是个拷贝顺序问题,其实,拷贝可以从前往后,也可以从后往前。 而前后顺序取决于dest和src之间的相对位置。
关于dest和src之间的相对位置,一共有三种情况。
一、 dest的指向存在于src之前,但是源字符串和被拷贝空间有重合的地方。:
momcpy函数,是src往dest里放
这个时候,拷贝顺序是将4拷贝到2的位置,将5拷贝到3的位置……
一直从4至7逐个拷贝。此顺序为从前到后顺序。
二、dest的指向存在于src整个中:
momcpy函数,是src往dest里放
此时无法从前到后放,只能从后往前放。
将7放到8的位置,将6放到7的位置……
三、源字符串的空间完全在目标字符串空间之后。
momcpy函数,是src往dest里放
此时不论是从前往后还是从后往前放,都是可以的。
memmove——内存拷贝函数二
面对重合内存时,memcpy会出现一些问题,但是在此情况下,memmove函数不会出现问题。
memmove函数的机制就解决了关于拷贝顺序的问题。
模拟实现memmove:
#include<stdio.h>
void* my_memmove(void* dest, const void* src, size_t num)
{
if (dest < src)//src往dest中拷
{
while (num--)
{
*(char*)dest = *(char*)src;
dest = (char*)dest + 1;
src = (char*)src + 1;
}
}
else
{
while (num--)
{
*((char*)dest+num) = *((char*)src+num);
}
}
return 0;
}
int main()
{
char arr1[20] = { 1,2,3,4,5,6,7,8,9,0 };
char arr2[20] = { 2 };
my_memmove(arr2, arr1 + 3, 4);
}
memmove函数的机制要优于memcpy。 但是每个函数都有它存在的意义。
在VS的库里面,memcpy函数的实现,反而可以拷贝重叠内存。
memcmp——比较内存内容函数
返回值 | 条件 |
---|---|
<0 | ptr1<ptr2 |
=0 | 内存块中内容相同 |
>0 | ptr1>ptr2 |
memset——内存设置函数
ptr向后的num个字节,都设置为value