内存函数介绍
内存函数与字符串函数的区别:
字符串函数:只能对字符串进行操作
内存函数:能够操作任何数据类型(对对象储存的内容进行操作)
memcpy(内存拷贝函数)
- 定义:
void *memcpy( void *dest, const void *src, size_t count //以字节为单位);
- 注意:
- 函数memcpy从source的位置开始向后复制num个字节的数据到destination的内存位置
- 这个函数在遇到 '\0' 的时候并不会停下来
- 如果source和destination有任何的重叠,复制的结果都是未定义的
- 函数演示:
#include <stdio.h> #include <string.h> int main() { int arr1[10] = { 1,2,3,4,5,6 }; int arr2[5] = { 0 }; memcpy(arr2, arr1, 16); int i = 0; int size = sizeof(arr2) / sizeof(arr2[0]); for (i = 0; i < size; i++) { printf("%d ", arr2[i]); } return 0; } //输出结果:1 2 3 4 0
- 模拟实现:
void* my_memcpy(void* des, const void* src, size_t n) { assert(des && src); void* ret = des;//记录初始位置 while (n--)//循环拷贝 { *(char*)des = *(char*)src; (char*)des = (char*)des + 1; (char*)src = (char*)src + 1; } return ret; }
memmove(内存移动函数)
- 定义:
void *memmove( void *dest, const void *src, size_t count );
注:memmove
函数相比于memcpy
函数能够很好的实现重复地址拷贝(如果source和destination有任何的重叠也能达到想要的结果)
- 函数演示:
#include <stdio.h> #include <string.h> int main() { int arr1[10] = { 1,2,3,4,5,6 }; int arr2[3] = { 0 }; memmove(arr1 + 2, arr1, 16); int i = 0; int size = sizeof(arr1) / sizeof(arr1[0]); for (i = 0; i < size; i++) { printf("%d ", arr1[i]); } return 0; } //输出结果:1 2 1 2 3 4
- 模拟实现:
void* my_memmove(void* des, const void* src, size_t n) { assert(des && src); void* ret = des; if (des < src) { //如果目标在源地前面则从前到后拷贝 while (n--) { *(char*)des = *(char*)src; (char*)des = (char*)des + 1; (char*)src = (char*)src + 1; } } else { //目标在源地后面则从后到前拷贝 while (n--) { *((char*)des + n) = *((char*)src + n); } } return des; }
memcmp(内存比较函数)
- 定义:
int memcmp( const void *buf1, const void *buf2, size_t count );
注:比较从ptr1和ptr2指针开始的num个字节
- 函数演示:
#include <stdio.h> #include <string.h> int main() { int arr1[] = { 1,2,3,4,5 }; int arr2[] = { 1,2,3,4,6 }; printf("%d ", memcmp(arr1, arr2, 16)); return 0; } //输出结果:0
- 模拟实现:
int my_memcmp(const void* src1, const void* src2, size_t n) { assert(src1 && src2); while (--n) { //遇到不同直接退出 if (*(char*)src1 != *(char*)src2) { break; } (char*)src1 = (char*)src1 + 1; (char*)src2 = (char*)src2 + 1; } return *(char*)src1 - *(char*)src2; }