mem系列函数作为一个在内存上进行操作的函数,它为许多特定情况的操作增加了便利,在编写c/c++程序中广泛应用。在使用mem系列函数时,需要包含头文件<string.h>
1.memcpy函数
函数原型:void*memcpy(void*target,const void*current,size_t t)
函数解读:以current区域开始的t个字节内容进行拷贝,拷贝到target区域当中
Code:
int a[10] = { 1,2,3,4,5,6,7,8,9,0 };
int b[10];
memcpy(b, a, 10 * sizeof(int));
memcpy函数可以快速进行结构体,类对象的内容拷贝(类对象还可以重载赋值运算符进行内容拷贝),但是如果被拷贝的源内存区域和写入的目标内存区域存在重叠的部分,此时memcpy函数就会存在不准确性,这时memmove函数的适用性就会更高。
2.memmove函数
函数原型:void* memmove(void* target,const void* current,size_t t);
函数解读:以current区域开始将t字节内容拷贝移动到target当中
Code:
int a[10] = { 1,2,3,4,5,6,7,8,9,0 };
memmove(a, a + 4, 6 * sizeof(int));
memmove可以保证在目标区域与被拷贝区域存在内存的重叠的时候可以保证结果的准确性
3.memcmp函数
函数原型 void memcmp(const void*buf1,const void *buf2,size_t t);
函数解读:比较buff1与buff2两个空间的t字节的内容是否相同
Code:
char buff1[] = "hello";
char buff2[] = "hello";
char buff3[] = "world";
printf("strcmp比较buff1和buff2:%d\n", strcmp(buff1, buff2));
printf("strcmp比较buff1和buff3:%d\n", strcmp(buff1, buff3));
printf("memcmp比较buff1和buff3:%d\n", memcmp(buff1, buff3,sizeof(buff1)));
相同返回0,小于返回-1,大于返回1
memcmp函数可以类比于strcmp函数两者都是对内容进行比较,strcmp比较两个字符串的内容是否相同,memcmp的适用性更广可以用于自定义数据类型和类对象等(类对象还可以重载关系运算符(!=,==))进行内容的比较
4.memset函数
函数原型:void *memset(void *target ,int ch,size_t t);
函数解读:对target目标区域进行内存上的赋值,将target的t个字节内容初始化成ch
Code:
int a[10];
int aa = 0;
memset(a, 0, 10 * sizeof(int));
注意:memset是对字节初始化内容的函数,如果对一个基类型不是一字节的数组进行赋值就会产生问题,eg:memset(target,10,sizeof(int))target基类型为int,理解将target[1]赋值为10是错的,一个int为四个字节,将target[1]的每个字节都会赋值成为10的二进制编码0000 1010
所以在使用memset初始化时一般适用0,-1 0的二进制编码(八位为例)0000 0000与-1二进制编码1111 1111每个位都是0/1,初始化就可以保证结果的准确性
5.memchr函数
函数解读:void *memchr( const void *target, int ch, size_t t );
函数解读:以target区域为开始的t个字节中搜索变量ch,如果变量ch在target中存在返回该变量在target中的地址,如果不存在返回nullptr
Code:
int a[10];
for (int i = 0; i < 10; i++){ a[i] = i;}
int *p = (int*)memchr(a, 8, 10 * sizeof(int));
注意:使用与malloc一样采用一个与基类型相同的指针变量接收返回地址需要进行强制转换
eg:int p*=(int*)memchr(target,8,10);