C语言内存函数

1.memcpy函数的使用和模拟实现

2.memmove函数的使用和模拟实现

3.memset函数的使用

4,memcmp函数的使用

memcpy函数的使用和模拟实现

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

函数功能:将源内存的值从源地址中拷贝到目标内存中,拷贝的字节数为num个,

函数的使用:

#include<stdio.h>
#include<string.h>
int main()
{
	int arr1[20] = { 1,2,3,4,5,6,7,8,9,10 };
	int arr2[] = { 11,22,33,44,55,66,77,88 };
	memcpy(arr1, arr2, 3 * sizeof(int));
	int i = 0;
	for (i = 0; i < 3; i++)
	{
		printf("%d ", arr1[i]);//打印拷贝的前三个数值
	}
	return 0;
}

运行的结果

memcpy函数的模拟实现

#include<stdio.h>
void*my_memecpy(void*s1,void*s2,size_t num)
{
	int* temp = (int*)s1;
	while (num)
	{
		*((char*)s1) = *((char*)s2);
			s1 = (char*)s1 + 1;
		    s2=(char*)s2+1;
			num--;
   }
	return temp;
}
int main()
{
	int arr1[20] = { 1,2,3,4,5 };
	int arr2[] = { 6,7,8,9,10 };
	my_memecpy(arr1, arr2, 5 * sizeof(int));
	for (int i = 0; i < 5; i++)
	{
		printf("%d ", arr1[i]);
	}
	return 0;
}

运行的结果是输出

6 7 8 9 10

值得注意的是,memecpy函数拷贝的关于两块独立的内存空间,那如果想要再同一块空间里面操作这个函数能不能得行

比如:

要将前面的数字拷贝到后面的数字中,让4 5 6数字变为1 2 3,

#include<stdio.h>
#include<string.h>
int main()
{
	int arr[6] = { 1,2,3,4,5,6};
	memcpy(arr+3, arr , 3 * sizeof(int));
	int i = 0;
	for (i = 0; i < 6; i++)
	{
		printf("%d ", arr[i]);
	}

	return 0;
}

函数运行结果是

上,虽然运行的结果是正确的,但只是仅限于VS操作软件,因为每复制一块空间,后面的空间都会瞬间被更新,再拷贝的时候将会拷贝已经更新的,但是要求的是拷贝旧的,(这里可以画图理解一下)

如果再其他的编译软件,,运行的结果将会变成

1 2 1 2 1 6

如果想要实现刚才的功能,需要函数memmove函数,再C语言中规定,memcpy拷贝的不重叠的内存,memmove函数拷贝的是重叠的函数

void * memmove ( void * destination, const void * source, size_t num );
#include<stdio.h>
#include<string.h>
int main()
{
	int arr[6] = { 1,2,3,4,5,6};
	memmove(arr+2, arr , 3 * sizeof(int));
	int i = 0;
	for (i = 0; i < 6; i++)
	{
		printf("%d ", arr[i]);
	}

	return 0;
}

函数运行的结果是

memmove函数的模拟实现

函数的实现分为两种情况

第一种:将前面的数据拷贝到后面去

如上图,将1 2 3 4 拷贝到4 5 6 7 上去,如果从1开始拷贝,4就会变成1,到后面将4拷贝到7的时候,就不是4拷贝到7了,而是1拷贝到7了,因为4已经被1代替了,种情况下,就要从后往前开始拷贝,就是4先拷贝到7,3拷贝到6,2拷贝到5,1拷贝到4,这就能很好的避免上面的问题

第二种,将后面的数据拷贝到后面去

如果从后往前拷贝的话,7会代替4,等到4拷贝到1的话,就不是4拷贝到1了,而是7拷贝到有,因为4已经被7代替了,这时需要从前往后拷贝,4先拷贝到1,5到2,6到3,7到4,

具体的代码如下

#include<stdio.h>
void* my_memmove(void* s1, const void* s2, size_t num)
{
	void* ret = s1;
	if (s1 > s2)
	{
		while (num--)
		{
			*((char*)s1 + num) = *((char*)s2 + num);

		}
	}
	else
	{
		while (num--)
		{
			*(char*)s1  = *(char*)s2 ;
			s1 = (char*)s1 + 1;
			s2 = (char*)s2 + 1;
		}
	}
	return s1;
}
int main()
{
	
	int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
	
	my_memmove(arr, arr + 4, 4 * sizeof(int));
	size_t sz = sizeof(arr) / sizeof(arr[0]);
	for (int i = 0; i < sz; i++)
	{
		printf("%d ", arr[i]);
	}
	return 0;
}

运行得结果

3.memset函数的使用

void * memset ( void * ptr, int value, size_t num ); 
memset是⽤来设置内存的,将内存中的值以字节为单位设置成想要的内容。

ptr:一块内存的初始位置

value:想要设置成得值

num:多少个字节

函数得使用:

#include<stdio.h>
#include<string.h>
int main()
{
	char arr[10] = "abcdef";
	memset(arr, 'x', 5);
	size_t sz = sizeof(arr) / sizeof(arr[0]);
	for (int i = 0; i < sz; i++)
	{
		printf("%c", arr[i]);
	}
	return 0;
}

运行得结果

4,memcmp函数的使用

int memcmp ( const void * ptr1, const void * ptr2, size_t num ); 

比较两块内存的值

同字符串函数strcmp函数一样,比较的同样是ASCI码值,如果相同的话,返回的是0,大于返回的是1,小于返回的是-1,从前往后两个内存的同一位置相互比较,相等就继续,一不相等就停下

  • 20
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值