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

之前实现过一些字符串操作函数,在C标准库中还有一些操作内存的函数

1、 memset

这个函数是用来设置内存内容的,平时我们可以利用它来初始化一段连续空间。
要注意的是这个函数的后两个参数,第二个参数是int,但是具体使用的时候用的是char类型,第三个参数是你要设置内存的大小,以字节为单位。

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
void* my_memset(void* buf, int value, size_t num) { char* su = (char*)buf; char ch = value; for (int i = num; i >0; --i) { *su = ch; su++; } return buf; }

2、 memcpy

这个函数是用来拷贝内存内容的函数,用来拷贝src所指的内存内容前n个字节到dest所指的内存上,它不像strcpy一样,遇到’’就停止拷贝,它会复制完n个字节
注:dest和src所指的内存区域不可重叠

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
void* my_memcpy(void* dest, void* src, size_t n) { void* res = dest; while (n--) { *(char*)dest = *(char*)src; dest = (char*)dest + 1; src = (char*)src + 1; } return res; }

3、 memmove

memmove函数同样是可以进行内存拷贝的,但是和memcpy不同的是,当dest和src重叠时,memmove依然可以处理,不过指向的效率比memcpy要慢

复制代码
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
void* my_memmove(void* dest, void* src, size_t n) { void* res = dest; if (dest <= src || (char*)dest >= (char*)src + n) //缓冲区没有重叠,从前向后拷贝 { while (n--) { *(char*)dest = *(char*)src; dest = (char*)dest + 1; src = (char*)src + 1; } } else //缓存区有重叠,从后向前拷贝 { dest = (char*)dest + n + 1; src = (char*)src + n + 1; while (n--) { *(char*)dest = *(char*)src; dest = (char*)dest - 1; src = (char*)src - 1; } } return res; }

4、memcmp

该函数是用来进行内存比较的函数,比较buf1和buf2的前n个字节。

  • 当buf1 < buf2,返回值 < 0
  • 当buf1 = buf2,返回值 = 0
  • 当buf1 > buf2,返回值 > 0

该函数是按字节进行比较的

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
int my_memcmmp(const void* buf1, const void* buf2, size_t n) { int res = 0; const char* p1 = (const char*)buf1; const char* p2 = (const char*)buf2; while (n--) { res = *p1 - *p2; if (*p1 != *p2) break; p1++; p2++; } return res; }

5、 memchr

该函数是从buf所指内存的前n个字节查找字符ch第一次出现的位置,然后返回这个位置,不存在就返回NULL

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
void* my_memchr(const void* buf, int ch, size_t n) { assert(buf); const char* p = (const char*)buf; while (n--) { if (*p != (char)ch) p++; else return p; } return NULL; }

在这里对这些函数就不一个个检测了,读者可以自行测验

最后

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

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

评论列表共有 0 条评论

立即
投稿
返回
顶部