我是靠谱客的博主 缥缈指甲油,这篇文章主要介绍C语言实现内存相关操作函数(memset、memcmp、memcpy、memmove),现在分享给大家,希望可以做个参考。

C语言实现内存相关操作函数(memset、memcmp、memcpy、memmove)
目录:

1.memset()函数
2.memcmp()函数
3.memcpy()函数
4.memmove()函数

一、memset()函数
(1)函数原型:void my_memset(void ptr, int value, size_t num);**
(2)功能:初始化内存空间
(3)代码:

复制代码
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
#include <stdio.h> #include <string.h> #include <assert.h> //memset函数 void* my_memset(void* ptr, int value, size_t num) { //参数有效性检查 assert(ptr != NULL); char* tptr = (char*)ptr; //初始化内存 while (num-- != 0) { *tptr++ = value; } return ptr; } int main() { int ar[10]; my_memset(ar, 0, sizeof(int) * 10); for (int i = 0; i < 10; ++i) { printf("%d ", ar[i]); } printf("n"); return 0; }

(4)运行截图:
在这里插入图片描述
二、memcmp()函数
(1)函数原型:int my_memcmp(const void ptr1, const void ptr2, size_t num);**
(2)功能:对内存中的内容进行比较
(3)代码:

复制代码
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
#include <stdio.h> #include <string.h> #include <assert.h> //memcmp函数 int my_memcmp(const void* ptr1, const void* ptr2, size_t num) { //参数有效性检查 assert(ptr1 != NULL && ptr2 != NULL); //保护参数 const char* tptr1 = (char*)ptr1; const char* tptr2 = (char*)ptr2; int ret = 0; //比较 while (num-- != 0) { ret = *tptr1 - *tptr2; if (ret != 0) { break; } tptr1++; tptr2++; } return ret; } int main() { char* ar = "hello"; char* br = "hella"; int flag = my_memcmp(ar, br, sizeof(char) * 5); printf("flag = %d", flag); return 0; }

(4)运行截图:
在这里插入图片描述
这里输出的值是14,原因是‘o’的ASCII码比‘a’的ASCII码大14。
三、memcpy()函数
(1)函数原型:void my_memcpy(void dest, const void* src, size_t num);**
(2)功能:内存拷贝
(3)代码:

复制代码
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
#include <stdio.h> #include <string.h> #include <assert.h> //memcpy函数 void* my_memcpy(void* dest, const void* src, size_t num) { //参数有效性检查 assert(dest != NULL && src != NULL); //保护参数 char* pdest = (char*)dest; const char* psrc = (const char*)src; //对内存中的内容进行拷贝 while (num-- != 0) { *pdest++ = *psrc++; } return dest; } int main() { int ar[10] = { 0,1,2,3,4,5,6,7,8,9 }; int br[10]; my_memcpy(br, ar, sizeof(int) * 10); for (int i = 0; i < 10; ++i) { printf("%d ", br[i]); } return 0; }

(4)运行截图:
在这里插入图片描述
四、memmove()函数
(1)函数原型:void my_memmove(void dest, const void* src, size_t num);**
(2)功能:与momcpy函数相似,但是mommove函数考虑了内存重叠问题
(3)代码:

复制代码
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
#include <stdio.h> #include <string.h> #include <assert.h> //memmove函数 void* my_memmove(void* dest, const void* src, size_t num) { //参数有效性检查 assert(dest != NULL && src != NULL); //保护参数 char* pdest = (char*)dest; const char* psrc = (const char*)src; //对内存中的内容进行拷贝 if (psrc >= pdest || pdest >= psrc + num) { while (num-- != 0) { *pdest++ = *psrc++; } } //如果发生内存重叠,则从后往前拷贝内存中的内容 else { pdest = pdest + num - 1; psrc = psrc + num - 1; while (num-- != 0) { *pdest-- = *psrc--; } } return dest; } int main() { char str1[20] = "abcdefghi"; char str2[] = "ABCDEF"; printf("str1 = %sn", str1); printf("str2 = %sn", str2); my_memmove(str1, str2, 6); printf("str1 = %sn", str1); my_memmove(str1 + 2, str1, 5); printf("str1 = %sn", str1); return 0; }

(4)运行截图:在这里插入图片描述
有小伙伴可能会疑惑,既然memcpy函数和memmove函数作用相一致,那为什么还要多提出一个memmove函数呢?原因是memmove函数考虑了内存重叠的问题,而memcpy函数并没有考虑这一问题(关于什么是没存重叠问题,请读者上网搜索查看)。当程序中不需要考虑内存重叠的问题时,建议使用memcpy函数,而当程序中需要考虑内存重叠问题时,建议使用memmove函数。

最后

以上就是缥缈指甲油最近收集整理的关于C语言实现内存相关操作函数(memset、memcmp、memcpy、memmove)的全部内容,更多相关C语言实现内存相关操作函数(memset、memcmp、memcpy、memmove)内容请搜索靠谱客的其他文章。

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

评论列表共有 0 条评论

立即
投稿
返回
顶部