(memcpy,memmove...)内存函数还不会??别怕,我来助你一臂之力

本文介绍了C语言中常见的内存函数,包括memcpy、memmove、memset及其区别和模拟实现。memcpy用于不重叠区域的数据复制,memmove则适用于可能重叠的内存块复制,memset用于设置内存块的特定值。同时,文章还提到了memcmp函数用于比较内存区域。通过对这些函数的理解和实践,有助于深入掌握C语言的内存操作。
摘要由CSDN通过智能技术生成

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


前言

在c语言的学习过程中,我们将不可避免的遇到内存函数,今天就让我们来学习一下内存函数的应用!!!


提示:以下是本篇文章正文内容,下面案例可供参考

一、内存函数是什么

内存函数是通过访问地址的方式操作对象(不必担心地址所对应的数据类型)可应用于任何类型的对象。

二、内存函数的分类(常见)

1.memcpy

void * memcpy ( void * destination, const void * source, size_t num );

  1. 函数memcpy从指针source开始往下拷贝num个字节的数据到destination所对应的空间
  2. 此函数在遇到‘\0’是不会停下,仍会自动拷贝
  3. 如果source和destination有所重叠,那么复制的结果都是未定义的
  4. memcpy函数的传参对象都是void类型,因此可以拷贝任意数据类型

memcpy的模拟实现

思路:

  1.         传递的执政不为NULL,所以用assert控制
  2.         因为不确定传递的指针个数,所以最稳妥的方法就是一个个传递,所以需要强制转化为          char*类型
  3.         arr2的值会变化,所以要将其开始的值赋值给一个void*类型的变量,最后返回它
#include<stdio.h>
#include<assert.h>
void* my_memcpy(void* arr2, const void* arr1,size_t num)
{
	assert(arr2 && arr1);
	void* p = arr2;
	while (num--)
	{
		*(char*)arr2 = *(char*)arr1;
		arr2 = (char*)arr2 + 1;
		arr1 = (char*)arr1 + 1;
	}
	return p;
}

2.memmove

void * memmove ( void * destination , const void * source , size_t num );
  • memcpy的差别就是memmove函数处理的源内存块和目标内存块是可以重叠的。
  • 如果源空间和目标空间出现重叠,就得使用memmove函数处理。

 memmove的模拟实现

思路:

  1.         传递的执政不为NULL,所以用assert控制
  2.         因为不确定传递的指针个数,所以最稳妥的方法就是一个个传递,所以需要强制转化为          char*类型
  3.         分类讨论,视情况而定,要用到分支语句。

void* my_memmove(void* arr2, const void* arr1, size_t num)
{
	assert(arr1 && arr2);
	void* p = arr2;
	if (arr2 < arr1)
	{
		while (num--)
		{
			*((char*)arr2 + num) = *((char*)arr1 + num);
		}
	}
	else
	{
		assert(arr2 && arr1);
		void* p = arr2;
		while (num--)
		{
			*(char*)arr2 = *(char*)arr1;
			arr2 = (char*)arr2 + 1;
			arr1 = (char*)arr1 + 1;
		}
	}
	return p;
}

3.memset

void *memset(void *ptr, int value, size_t n);

ptr:指向要填充的内存块的指针。

value:要设置的值。该值以 int 形式传递,但该函数使用此无符号 char 转换来填充内存块

size_t:字节数,无符号整型。

与strcpy的区别是:strcpy是复制,而memset是替换!!!

模拟实现:

思路:传递的执政不为NULL,所以用assert控制

           因为不确定传递的指针个数,所以最稳妥的方法就是一个个传递,所以需要强制转化为          char*类型

#include<stdio.h>
#include<assert.h>

void* my_memset(void* ptr, int value, size_t num)
{
	assert(ptr);
	void* p = ptr;
	while (num--)
	{
		*((char*)ptr) = (char) value;
		ptr = (char*)ptr + 1;
	}
}

4.memcmp

int memcmp ( const void * ptr1 , const void * ptr2 , size_t num );
比较从 ptr1 ptr2 指针开始的 num 个字节
返回值如下:

总结

内存函数的简单介绍!!!以及memcpy,memset,memmove的区别以及模拟实现

评论 20
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值