栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

C语言memcpy、memmove等内存函数的实现

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

C语言memcpy、memmove等内存函数的实现

今天来实现memset、memcpy和memmove三个比较常见的内存函数,具体实现如下。


 memset:

C 库函数 void *memset(void *str, int c, size_t n) 复制字符 c(一个无符号字符)到参数 str 所指向的字符串的前 n 个字符。

void* my_memset(void* start, int c, int count) {

	//断言非空
	assert(start);

	char* s = (char*)start;
	while (count--) {
		*s = c;
		s++;
	}

	return start;
}

 memcpy:

C 库函数 void *memcpy(void *str1, const void *str2, size_t n) 从存储区 str2 复制 n 个字节到存储区 str1。

void* my_memcpy(void* dest, const void* src, int count) {

	//断言
	assert(dest && src);

	char* d = (char*)dest;
	char* s = (char*)src;
	//循环copy
	while (count--) {
		*d++ = *s++;
	}
	return dest;
}

memmove:

C 库函数 void *memmove(void *str1, const void *str2, size_t n) 从 str2 复制 n 个字符到 str1,但是在重叠内存块这方面,memmove() 是比 memcpy() 更安全的方法。如果目标区域和源区域有重叠的话,memmove() 能够保证源串在被覆盖之前将重叠区域的字节拷贝到目标区域中,复制后源区域的内容会被更改。如果目标区域与源区域没有重叠,则和 memcpy() 函数功能相同。

void* my_memmove(void* dest, const void* src, int count) {

	//断言
	assert(dest && src);

	char* d = (char*)dest;
	char* s = (char*)src;

	//如果复制源区域和目的地区域重合
	if (s + count > d) {
		while (count) {
			*(d + count - 1) = *(s + count - 1);
			count--;
		}
	}
	//若不重合 则copy方式和memcpy一样
	else {
		while (count--) {
			*d++ = *s++;
		}
	}

	return dest;
}
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/1001662.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号