内存操作函数
memcpy
头文件:string.h
基本用途:进行不相关(不重叠的内存)拷贝。
函数原型:void* memcpy(void* destination,//指向目标数据的指针
const void* source,//指向被拷贝数据的指针
size_t num);//拷贝的数量(单位:字节)
注:
1.基本原理:从source的位置开始向后复制num个字节的数据到destnation的内存位置。
2.这个函数与strcpy不同,它遇见’\0’的时候并不会停下来。
3.如果source和destnation有任何的重叠,复制的结果都是未定义的。
4.void* 之前讲过,为了保证泛用性,使用void*接收任意类型的数据。
使用举例:
#include #include struct {char name[40];int age;}person, person_copy;int main(){char myname[] = "Pierre de Fermat";memcpy(person.name, myname, strlen(myname) + 1);person.age = 46;memcpy(&person_copy, &person, sizeof(person));printf("person_copy: %s , %d\n", person_copy.name, person_copy.age);return 0;}
这是将字符串和结构体成员变量拷贝到另一个结构体的举例。
为了更好的理解这一函数,下面我们来模拟实现一下它。
void* my_memcpy(void* dest, const void* src, size_t num){//断言,防止dest或者src是空指针,如果是空指针则会报错assert(dest && src);//保存起始地址void* ret = dest;while (num--){//一次用最小单位(字节)移动,保证泛用性*(char*)dest = *(char*)src;//注:强制类型转换只是临时的,后面+1操作时已不存在dest = (char*)dest + 1;src = (char*)src + 1;}//返回目标空间的起始地址return ret;}
memmove
头文件:string.h
基本用途:重叠内存块的拷贝。
函数原型:void* memove(void* destnation, const void* source, size_t num)
注:
1.和memcpy的区别就是memove函数处理的源内存块和目标内存块可以重叠。
2.如果原空间和目标空间出现重叠,就得使用memmove函数处理。
使用举例:
#include #include int main(){char str[] = "memmove can be very useful.....................";//将字符串中从第15个元素的位置向后数共11个字符挪到从第20个字符开始向后数第11个元素memmove(str + 20, str + 15, 11);puts(str);return 0;}
该函数的模拟实现:
#include #include #include void* my_memmove(void* dest, const void* src, size_t num){assert(dest && src);//当目标位置地址小于源内存块数据地址时,采用从前向后拷贝的方式if (dest src){//将dest和src指针定位到各自最后的内存地址处dest = (char*)dest + num - 1;src = (char*)src + num - 1;//根据字节数量一个一个移动内存单元while (num--){*(char*)dest = *(char*)src;//向前移动一位dest = (char*)dest - 1;src = (char*)src - 1;}}}
memcmp
头文件:stdio.h
基本用途:顾名思义,与strcmp函数类似,这个函数是比较内存数据大小的(逐字节)。
函数原型:int memcmp(const void* ptr1, const void* ptr2, size_t num);
注:
1.比较从ptr1和ptr2开始的num个字节
2.与strcmp返回值类似,仍是第一个指针内容大于第二个指针的内容,返回大于零的数字,第一个指针内容小于第二个指针的内容,返回小于零的数字,相等,返回零。
基本举例:
#include #include int main(){char buffer1[] = "axxxxxxxxxxx";char buffer2[] = "bbbbbbbbbbbb";int n;n = memcmp(buffer1, buffer2, sizeof(buffer1));printf("%d", n);return 0;}
结果:
这期的博客就分享到这里啦,谢谢各位啦!!!