我是靠谱客的博主 坚定心情,这篇文章主要介绍C语言:@ 模拟实现内存操作函数(memcpy、memset、memcmp、memmove),现在分享给大家,希望可以做个参考。

以mem开头的函数,其操作以字节为基本单位,与类型无关(因为参数都为void*,即接收所有类型)

  • void 不能定义变量,因为不同的编译器中规定的大小不同
  • void*可以定义变量,它也是指针,大小为4或8,但不能解引用,解引用后为void,就不知道指针指向的是谁了
  • void*一般用来用来传值,可以接收任意类型,常见用来接收地址类型

memcpy 内存拷贝

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
void *my_memcpy(void *dst, void *src, int num) { assert(dst); assert(src); //得有一个容器 char *dst_p = (char*)dst;//强转成char* 因为以字节为单位,char 占一个字节 char *src_p = (char*)src; //拷num个字节,循环一次拷一个 while (num--) { *dst_p = *src_p; dst_p++, src_p++; } return dst; } int main() { char *arr = "hello world"; char arr1[32]; my_memcpy(arr1, arr, strlen(arr)+1);//按字节拷贝 +1是给结尾带'' system("pause"); return 0; }

memset 将内存中每个字节的内容设置为特定的值

复制代码
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_memset(void *arr, int value, size_t num) { assert(arr); char *dst = (char*)arr; size_t i = 0; for (; i < num; i++) { *(dst + i) = (char)value; } return arr; } int main() { int arr2[] = { 1, 2, 3, 4, 5 }; int sz = sizeof(arr2) / sizeof(arr2[0]); my_memset(arr2, 0, sizeof(arr2));//置为0 for (int i=0; i < sz; i++) { printf("%d", arr2[i]); } printf("n"); system("pause"); return 0; }

memcmp 内存比较

复制代码
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
int my_memcmp(const void *dst,const void *src, int num) { assert(dst); assert(src); char *p1 = (char*)dst; char *p2 = (char*)src; while (num&&*p1 == *p2) { p1++; p2++; num--; } if (*p1 > *p2) { return 1; } else if (*p1<*p2) { return -1; } return 0; int main() { const char *a1 = "abcdef"; const char *a2 = "def"; int ret = my_memcmp(a1, a2, 3); printf("%dn", ret); system("pause"); return 0; }

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
26
27
28
29
30
31
32
33
34
35
36
37
38
39
void *my_memmove(void *dst, void *src, size_t num) { assert(dst); assert(src); char *dst1 = (char*)dst; char *src1 = (char*)src; //dst一定要比src大 //dst>src 说明dst在src的后面 dst<src+num 说明dst在src和src+num之间,也就是这个长度之间,num是src的长度 if ((dst1 >= src1) || (dst1<=src1+num)) { //从右向左 dst1 = dst1 + num - 1; src1 = src1 + num - 1; while (num--) { *dst1 = *src1; dst1--, src1--; } } else { //从左向右拷 while (num--) { *dst1 = *src1; dst1++, src1++; } } return dst1; } int main() { char dst[] = "abcdef"; char src[] = "cdefgh"; my_memmove(dst+1, src, strlen(dst) + 1); printf("%sn", dst); system("pause"); return 0; }
  • 与memcpy的区别就是memmove函数处理的源内存块的目标内存块是可以重叠的

最后

以上就是坚定心情最近收集整理的关于C语言:@ 模拟实现内存操作函数(memcpy、memset、memcmp、memmove)的全部内容,更多相关C语言:@内容请搜索靠谱客的其他文章。

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

评论列表共有 0 条评论

立即
投稿
返回
顶部