我是靠谱客的博主 单身金毛,这篇文章主要介绍模拟实现memcpy、memmove,现在分享给大家,希望可以做个参考。

模拟实现memcpy

从源内存地址的起始位置开始拷贝若干个字节到目标内存地址

函数原型 : void* memcpy(void* dest, const void* src, size_t n);
参数类型: 指向目标内存指针,指向源内存的指针,拷贝字节数
返回值 : 返回一个目标内存区的指针dest

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
#define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <stdlib.h> #include <string.h> #include <assert.h> void* my_memcpy(void* dest, const void* src, size_t n) { //参数第一种判断 //if (dest == NULL || src == NULL || n > 0) //{ // fprintf(stderr, "errorn"); // return NULL; //} //参数第二种判断 assert(dest != NULL);//断言判断该指针是否是空指针 assert(src != NULL);//因为空指针不能解引用 void* result = dest;//这个也可以不写 //循环拷贝直到第n个值 while (--n) { *(char*)dest = *(char*)src;//强制类型转换,n为字节个数 dest = (char*)dest + 1; src = (char*)src + 1; } return result;//返回result指向目标空间的起始地址 } int main() { //memcpy从源内存地址的起始位置开始拷贝若干个字节到目标内存地址 //char arr1[20] = "hello world"; //char arr2[20]; //int sz = sizeof(arr1) / sizeof(arr1[0]); //memcpy(arr2, arr1,sz ); //printf("%s", arr2); char arr1[11] = { 1,2,3,4,5,6,7,8,9,10}; char arr2[11] = { 0 }; char sz = sizeof(arr1) / sizeof(arr1[0]); my_memcpy(arr2, arr1, sz); for (int i = 0; i < sz-1; ++i) { printf("%d ", arr2[i]); } printf("n"); system("pause"); return 0; }

运行结果如下:
在这里插入图片描述

下面是模拟实现memmove

memmove和memcpy有相同之处:memmove包含memcpy
意思就是:用memmove不会出现错误,但用memcpy可能会出错;
其实memmove的if语句讨论的内容就是memcpy,因为memmove多写了else语句
所以优先使用memmove

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
void* my_memmove(void* dest, const void* src, int n) { assert(dest != NULL); assert(src != NULL); char* pdest = (char*)dest;//强制类型转换 const char* psrc = (const char*)src;//强制类型转换 //正常情况下从头部开始拷贝 if (pdest < psrc ) { while (n--) { *pdest = *psrc; } } else//当出现内存覆盖时,从尾部开始向前拷贝 { while (n--) { *(pdest + n) = *(psrc + n); } } return dest; }

最后

以上就是单身金毛最近收集整理的关于模拟实现memcpy、memmove的全部内容,更多相关模拟实现memcpy、memmove内容请搜索靠谱客的其他文章。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(71)

评论列表共有 0 条评论

立即
投稿
返回
顶部