目录
学会使用内存操作函数memcpy、memmove、memcmp并自主实现
学习目标:
学会使用内存操作函数memcpy、memmove、memcmp并自主实现
学习内容:
!!!!!!!注:建议与主页的字符串函数对比学习!!!!!!!
1.1.1 memcpy函数介绍
void * memcpy ( void * destination, const void * source, size_t num );
函数memcpy从source的位置开始向后复制num个字节的数据到destination的内存位置,返回目的空间的起始地址。注:该函数遇到‘\0’时并不会停下来,如果source和destination有任何的重叠,复制的结果都是未定义的。
它与之前的字符串函数strncpy的区别是字符串函数仅仅能操作字符串,而它能操作任意类型,因为它是在内存层面拷贝的。
1.1.2 自主实现memcpy函数
它的实现原理与函数strncpy类似,但因为它可以操作任意类型所以指针类型为通用型指针void*,注意通用型指针不可以解引用和++、--操作,所以将其强类型转换。
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<assert.h>
void* my_memcpy(void* dest, const void* src, size_t num)
{
void*ret = dest; //记录目的空间的起始位置
assert(dest&&src);
while (num--)
{
*(char*)dest = *(char*)src;
++(char*)dest;
++(char*)src;
}
return ret;
}
1.2.1 memmove函数
void * memmove ( void * destination, const void * source, size_t num );
它的功能与memcpy一样也是从source的位置开始向后复制num个字节的数据到destination的内存位置,返回目的空间的起始位置,但不一样的是它可以操作source和destination重叠的情况。如:1 2 3 4 5 6 7 将里面的1234复制到4 5 6 7的位置上。
1.2.2 自主实现memmove函数
分析:将1234复制到4567中时,如果先将1复制到4中会丢失了4,所以要从后面开始将4复制到7中再到3->6等等。那假如是4567复制到1234时,如果从后面开始的话7->4,那么4会丢失,所以要改为4复制到4中,5->3等等。所以实现时要分成两种情况。
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<assert.h>
void* my_memmove(void* dest, const void* src, size_t num)
{
void* ret = dest;
assert(dest&&src);
if (dest < src) //从前面复制到后面
{
while (num--)
{
*(char*)dest = *(char*)src;
++(char*)dest;
++(char*)src;
}
}
else
{
while (num--)//从后面复制到前面
{
*((char*)dest + num) = *((char*)src + num);
}
}
return ret;
}
1.3.1 memcmp函数
int memcmp ( const void * ptr1,const void * ptr2,size_t num );
该函数比较从ptr1和ptr2指针开始的num个字节,与strncmp类似,返回值也相同。不同的是它在内存层面操作,可以操作任意类型。
1.3.2 自主实现memcmp函数
实现与strccmp类似。
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<assert.h>
int my_memcmp(const void * ptr1, const void * ptr2, size_t num)
{
assert(ptr1&&ptr2);
char* dest = (char*)ptr1;
char* src = (char*)ptr2;
//比较
while (num && (*dest == *src))
{
dest++;
src++;
num--;
}
if (!num || ((*dest) && (*src))) //num个字符或者字符都比较完时
{
return 0;//完全相等时
}
return(*dest - *src);
}
争取每次学习都能掉十根头发,不掉头发的程序员不是好程序员。
——Ace Young