内存操作函数:
函数介绍:
1.memcpy函数
void* memcpy( void* dest, const void* src, size_t count)
这个函数主要用于拷贝内存中的数据,将src中的数据拷贝到dest的空间中。
我自己的实现:
void* my_memcpy(void* dest,const void* src, size_t num)
{
assert(dest != NULL);
assert(src != NULL);
char* tmp1 = (char*)dest;//一个字节一个字节地改变
char* tmp2 = (char*)src;
void* ret = dest;
while (num--)//总字节数一直减到0
{
*(char*)tmp1 = *(char*)tmp2;
tmp1++;
tmp2++;
}
return ret;
}
int main()
{
char arr1[] = "abcdeff";
char arr2[50] = { 0 };
char* ret=(char*)my_memcpy(arr2, arr1, sizeof(arr1));
printf("%s", ret);
return 0;
}
2.memmove函数
void* my_memmove(void* dest,const void* src, size_t num)
这个函数用于拷贝字符串,但与前面memcpy函数不同的是这个函数多用于拷贝有重叠部分的字符串的函数。如将字符串arr1[]={0,1,2,3,4,5,6,7,8,9}中的前4个字符0,1,2,3拷贝到2,3,4,5中去。而2、3是重叠部分。即满足使用这个函数的条件。
代码实现:
void* my_memmove(void* dest, const void* src, int num)
{
assert(dest);
assert(src);
void* ret = dest;
if (dest < src)//目标空间在原空间左边,从前往后拷贝
{
while (num--)
{
*((char*)dest) = *((char*)src);
++(char*&)dest;
++(char*&)src;
}
}
if (dest > src)//目标空间在原空间右边,从后往前拷贝
{
while (num--)
{
*((char*)dest+num) = *((char*)src+num);
}
}
return ret;
}
int main()
{
int arr1[] = {0,1,2,3,4,5,6,7,8,9};
my_memmove(arr1+2,arr1,20);
//将0,1,2,3,4拷贝到2,3,4,5,6中
//目标数组0,1,0,1,2,3,4,7,8,9
return 0;
}
3.memcmp函数
int memcpy( void* dest, const void* src, size_t count)
将目标区域的内容与原区域的内容进行对比,可设置count来规定用来对比的长度(单位字节)。(vs2019环境下)若dest<src,返回-1;若dest>src,返回1;若dest=src,返回0;
4.memset函数
void* memset( void* dest, int c, size_t count );
这个函数可以用于将字符放入目标空间,其中dest为目标空间地址,c为要放入的字符,count为要放入的字符的个数(一个修改单位为一个字节)。如:
int main()
{
char arr1[10] = {0};
memset(arr1,'e',10);
int arr2[10] = {0};
memset(arr2, 8, 10);
return 0;
}
arr1的改变没问题,因为char类型的数组每个单位都是1个字节,所以可以改变10个单位
而arr2的变化就有问题,因为这个函数的改变是以字节为单位,所以改变时只改变前面10个字节,而int类型的函数一个单位是4个字节,所以只能改变前面的一些内容。
---2022/2/8