网站平台建设意见,网站首页页面设计模板,怎么自己制作二维码,国家企业信用信息网查询模拟实现C语言–memcpy函数和memmove函数 文章目录 模拟实现C语言--memcpy函数和memmove函数一、memcpy函数和memmove函数1.1 memcpy函数是什么1.1 memmove函数是什么 二、使用示例2.1 从起始位置复制2.2 从任意位置复制 三、模拟实现3.1 模拟实现1--memcpy函数3.2 针对缺点改进…模拟实现C语言–memcpy函数和memmove函数 文章目录 模拟实现C语言--memcpy函数和memmove函数一、memcpy函数和memmove函数1.1 memcpy函数是什么1.1 memmove函数是什么 二、使用示例2.1 从起始位置复制2.2 从任意位置复制 三、模拟实现3.1 模拟实现1--memcpy函数3.2 针对缺点改进的模拟实现2--memmove函数3.2.1 刨析原因3.2.2 改正方法3.2.3 代码--模拟实现memmove函数3.2.4 memcpy函数和memmove函数平台问题 一、memcpy函数和memmove函数
1.1 memcpy函数是什么
void * memcpy ( void * destination, const void * source, size_t num );strcpy函数是字符串拷贝函数只能拷贝字符串而其他类型无法使用strcpy函数拷贝而memcpy函数属于内存拷贝函数可以拷贝其他类型。
1.1 memmove函数是什么
void * memmove ( void* destination, const void * source, size_t num );和memcpy的差别就是memmove函数处理的源内存块和目标内存块是可以重叠的。如果源空间和目标空间出现重叠就得使用memmove函数处理。
二、使用示例
函数memcpy从source的位置开始向后复制num个字节的数据到destination的内存位置。这个函数在遇到 ‘\0’ 的时候并不会停下来如果source和destination有任何的重叠复制的结果都是未定义的。
2.1 从起始位置复制
#define _CRT_SECURE_NO_WARNINGS 1
#includestdio.h
#include string.h
int main()
{int i 0;int arr1[] { 1,2,3,4,5,6,7,8,9,10 };int arr2[10] { 0 };memcpy(arr2, arr1, 20);for (i 0; i 10; i){printf(%d , arr2[i]);}return 0;
}2.2 从任意位置复制
#define _CRT_SECURE_NO_WARNINGS 1
#includestdio.h
#include string.h
int main()
{int i 0;int arr1[] { 1,2,3,4,5,6,7,8,9,10 };int arr2[10] { 0 };memcpy(arr2, arr12, 20);for (i 0; i 10; i){printf(%d , arr2[i]);}return 0;
}三、模拟实现
3.1 模拟实现1–memcpy函数
#define _CRT_SECURE_NO_WARNINGS 1
#includestdio.h
#include string.h
#include assert.hvoid* my_memcpy(void* destination, const void* source, size_t num)
{void* ret destination;assert(destination);assert(source);/** copy from lower addresses to higher addresses*/while (num--) {*(char*)destination *(char*)source;destination (char*)destination 1;source (char*)source 1;}return(ret);
}
int main()
{int i 0;int arr1[] { 1,2,3,4,5,6,7,8,9,10 };int arr2[10] { 0 };my_memcpy(arr2, arr12, 20);for (i 0; i 10; i){printf(%d , arr2[i]);}return 0;
}3.2 针对缺点改进的模拟实现2–memmove函数
模拟实现1的代码有一个缺陷就是不能进行自我拷贝
#define _CRT_SECURE_NO_WARNINGS 1
#includestdio.h
#include string.h
#include assert.hvoid* my_memcpy(void* destination, const void* source, size_t num)
{void* ret destination;assert(destination);assert(source);/** copy from lower addresses to higher addresses*/while (num--){*(char*)destination *(char*)source;destination (char*)destination 1;source (char*)source 1;}return(ret);
}
int main()
{int i 0;int arr1[] { 1,2,3,4,5,6,7,8,9,10 };int arr2[10] { 0 };my_memcpy(arr12, arr1, 20);for (i 0; i 10; i){printf(%d , arr1[i]);}return 0;
}3.2.1 刨析原因 3.2.2 改正方法 当dst指针指向的地址在src指针指向位置的右边时这种情况的赋值应该从后向前赋值就是12345先让5赋值在7的位置依次循环 当dst指针指向的地址在src指针指向位置的右边时这种情况的赋值应该从前向后赋值34567先将3赋值给1的位置依次循环
3.2.3 代码–模拟实现memmove函数
#define _CRT_SECURE_NO_WARNINGS 1
#includestdio.h
#include string.h
#include assert.hvoid* my_memmove(void* destination, const void* source, size_t num)
{void* ret destination;assert(destination);assert(source);if (destination source){//从前向后赋值while (num--){*(char*)destination *(char*)source;destination (char*)destination 1;source (char*)source 1;}}//从后向前赋值else{while (num--){*((char*)destinationnum) *((char*)sourcenum);}}return ret;
}int main()
{int i 0;int arr1[] { 1,2,3,4,5,6,7,8,9,10 };int arr2[10] { 0 };my_memmove(arr12, arr1, 20);for (i 0; i 10; i){printf(%d , arr1[i]);}return 0;
}3.2.4 memcpy函数和memmove函数平台问题
目前在vs环境下这两个函数基本没有区别memcpy也可以解决内存重复的问题。别的平台可能还是会有这个问题