内存函数<C语言>

2024-06-01 1091阅读

前言

        前面两篇文章介绍了字符串函数,不过它们都只能用来处理字符串,C语言中也内置了一些内存函数来对不同类型的数据进行处理,本文将介绍:memcpy()使用以及模拟实现,memmove()使用以及模拟实现,memset()使用,memcmp()使用。


目录

前言

memcpy()使用以及模拟实现

memmove()使用以及模拟实现

memset()使用

 memcmp()使用


memcpy()使用以及模拟实现

        函数参数及其返回类型:

void* memcpy(void* destination, const void* source ,size_t num);
//返回值为目标空间的起始地址

作用:

从源地址起复制num个字节到目标地址

注意点:

①memcpy函数不负责重叠内存的情况(如果源地址和目的地址有任何重叠,结果都是未定义的)

②头文件

使用举例:

内存函数<C语言>

 模拟实现:

//memcpy模拟实现
#include
void* my_memcpy(void* s1, const void* s2, size_t num) {
	assert(s1 && s2);//防止传入空指针
	void* p1 = s1;
	//使用一个值保存首地址,等下好返回首地址
	while (num--) {
		*(char*)s1 = *(char*)s2;
		(char*)s1 = (char*)s1 + 1;
		//不能使用(char*)s1++,因为(char*)(强制类型转换)和++(自增)都是表达式
		//因为第一个表达式执行后是临时的,转换结果没被保存下来
		(char*)s2 = (char*)s2 + 1;
	}
	return p1;
}
int main() {
	int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
	int arr1[10] = { 0 };
	int i = 0;
	my_memcpy(arr1, arr, sizeof(arr));
	for (i = 0; i  

运行结果:

内存函数<C语言>


memmove()使用以及模拟实现

         函数参数及其返回类型:

void* memmove(void* destination, const void* source ,size_t num);
//返回值为目标空间的起始地址

作用:

从源地址起复制num个字节到目标地址(memmove函数能完全代替memcpy函数),尽量使用memmove函数

注意点:

①memcpy函数和memmove函数最大区别就是,memmove函数能实现源地址和目的地址有重叠的拷贝,所以memmove函数能完全代替memcpy函数

②头文件

使用举例:

内存函数<C语言>

 模拟实现:

前面我们已经实现了memcpy函数的模拟实现,现在我们面临唯一问题就是如何解决,源地址和目的地址有重叠的拷贝,经过分析我们发现重叠其实有两种情况:

①源头地址大于目标地址时

        源地址从后往前拷贝

②目的地址大于源头地址时

        源地址从前往后拷贝

内存函数<C语言>

 代码:

//memmove模拟实现
#include
#include
void* my_memmove(void* s1, const void* s2, size_t num) {
	assert(s1 && s2);
	void* ret = s1;
	if (s2 >= s1) {//①源头地址大于目标地址时
		while (num--) {
			*((char*)s1+num) = *((char*)s2+num);
		}
	}
	else {//②目的地址大于源头地址时
		while (num--) {
			*(char*)s1 = *(char*)s2;
			(char*)s1 = (char*)s1 + 1;
			(char*)s2 = (char*)s2 + 1;
		}
	}
	return ret;
}
int main() {
	int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
	my_memmove(arr + 5, arr, sizeof(arr[0]) * 5);
	for (int i = 0; i  

运行结果:

内存函数<C语言>


memset()使用

         函数参数及其返回类型:

void* memset(void* ptr, int value ,size_t num);
//返回值为被填充空间的起始地址

作用:

用来设置内存,将内存空间以字节为单位设置成想要内容

注意点:

①是以字节为单位设置的,当为int类型设置时可能出错

②头文件

使用举例:

内存函数<C语言>


 memcmp()使用

         函数参数及其返回类型:

int memcmp(const void* ptr1, const void* ptr2,size_t num);
//返回值是大于:大于0的数,等于:0,小于:小于0的数

作用:

比较两块空间前num个字节

注意点:

①是以字节为单位比较

②头文件

使用举例:

内存函数<C语言>

VPS购买请点击我

免责声明:我们致力于保护作者版权,注重分享,被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自自研大数据AI进行生成,内容摘自(百度百科,百度知道,头条百科,中国民法典,刑法,牛津词典,新华词典,汉语词典,国家院校,科普平台)等数据,内容仅供学习参考,不准确地方联系删除处理! 图片声明:本站部分配图来自人工智能系统AI生成,觅知网授权图片,PxHere摄影无版权图库和百度,360,搜狗等多加搜索引擎自动关键词搜索配图,如有侵权的图片,请第一时间联系我们,邮箱:ciyunidc@ciyunshuju.com。本站只作为美观性配图使用,无任何非法侵犯第三方意图,一切解释权归图片著作权方,本站不承担任何责任。如有恶意碰瓷者,必当奉陪到底严惩不贷!

目录[+]