目录
一、内存拷贝库函数memcpy
1、memcpy介绍
函数名称 | memcpy |
函数头文件 | <string.h> |
函数格式 | void * memcpy ( void * dest, const void * src, size_t num ); |
函数功能 | memcpy从src的位置开始向后复制num个字节的数据到dest的内存位置, 这个函数在遇到 '\0' 的时候并不会停下(), 如果dest和src有任何的重叠,复制的结果都是未定义的。 |
返回类型 | 返回dest的起始位置 |
2、c语言的模拟实现memcpy
void* gg_memmove(void* arr2, void* arr1, int num) { //因为不知道要接受怎么的类型所以使用
//所以使用void*就可以接受任何类型
void* red = arr2; //记录目的地的起始位置用以返回
assert(arr2);
assert(arr1);
while (num--) {
*((char*)arr2)++ = *((char*)arr1)++; //一个一个字节的交换
}
return red;
}
int main() {
int arr[] = { 1,2,3,4,5,6,7,8,9 };
int arr2[20] = {0};
int* red = (int*)gg_memmove(arr+2, arr, 16);
for (int i = 0; i < 4; i++) {
printf("%d ", red[i]);
}
}
编译结构为什么会是:1 2 1 2呢?
我们预期是要将arr的0到3的下标元素{1,2,3,4};
拷贝到arr的2到4的下标元素中,打印出来的结果和我们预期的出现了一点差错
这是因为如果目的地和源空间有任何的重叠,复制的结果都是未定义的。
但是在vs的memcpy库函数,即使有重叠也会将源空间里的数据完全不变的拷贝到目的地空间(但这其实是memmove要实现的功能)。
二、内存拷贝库函数memmove
1、memmove介绍
函数名称 | memmove |
函数头文件 | <string.h> |
函数格式 | void* memmove(void* destination, const void* source, size_t num); |
函数功能 | memcpy从source的位置开始向后复制num个字节的数据到destination的内存位置, 这个函数在遇到 '\0' 的时候并不会停下(),将数字字节的值从源指向的位置复制到目标所指向的内存块。复制就像使用了中间缓冲区一样进行,从而允许目标和源重叠。 |
返回类型 | 返回destination的起始位置 |
2、c语言的模拟实现memcpy
void* gg_memmove(void* arr2, void* arr1, int num) {
void* red = arr2;
assert(arr2);
assert(arr1);
while(num--){
if (arr2 > arr1) { //判断目的地起始位置在原空起始位置的大小(判断位置)确定交换方式
*(((char*)arr2) + num) = *(((char*)arr1) + num); //从后往前交换
}
else {
*((char*)arr2)++= *((char*)arr1)++; //从前往后交换
}
}
return red;
}
int main(){
int arr[] = {1,2,3,4,5,6,7,8,9};
int arr2[20]={0};
int*red=(int*)gg_memmove(arr+2,arr,16);
for (int i = 0; i <4; i++) {
printf("%d ", red[i]);
}
}
三、内存比较函数memcmp
1、memcmp介绍
函数名称 | memcmp |
函数头文件 | <string.h> |
函数格式 | int memcmp ( const void * ptr1, const void * ptr2, size_t num ); |
函数功能 | 将 ptr1 所指向的起始空间的第num个字节和与 ptr2 所指向的起始空间的第num个字节进行比较,如果它们全部匹配,则返回零,如果它们不匹配,则表示哪个值更大。 |
返回类型 | <0 在两个内存块中不匹配的第一个字节在 ptr1 中的值低于在 ptr2 中的值(如果计算为无符号字符值) 0 内容相等 >0 在两个内存块中都不匹配的第一个字节在 ptr1 中的值大于在 ptr2 中的值(如果计算为无符号字符值) |
四、内存设置函数memset
1、memset介绍
函数名称 | memset |
函数头文件 | <string.h> |
函数格式 | void * memset ( void * ptr, int value, size_t num ); |
函数功能 | 将 ptr 所指向的内存块的前 num 个字节设置value为值 |
返回类型 | 返回 ptr |