0
点赞
收藏
分享

微信扫一扫

内存函数详解

念川LNSC 2022-04-13 阅读 71

目录

内存函数

1.memmcpy

2.memmove

3.memcmp

4.memset


内存函数

什么是内存操作函数?

我们认识字符串操作函数(strlen,strcopy等),字符操作函数(tolower等)。这些函数的操作对象都需要符合一种指定类型,比较局限。

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

下面将简单介绍几种常见的内存操作函数。


1.memmcpy

memmcpy,将给定源地址上的内容拷贝到目标地址上,拷贝字节数需自己设定。

void memcopy(void* dest, const void* scr, int count)
{
	assert(dest && scr);
	while (count--)        //共count次,一次一个字节
	{
		*((char*)dest + count) = *((char*)scr + count);      //将源拷贝到目标地
	}
}
int main()
{
	int arr1[10] = { 1,2,3,4,5,6,7,8,9,10 };
	int arr2[5] = { 0 };
	memcopy(arr2,arr1, 20);    //  将arr1数组的前20个字节拷贝arr2中
	for (int i = 0; i < 5; i++)
	{
		printf("%d ", arr2[i]);
	}
	return 0;
}

这个函数有一个缺点就是拷贝自身的时候有可能会出现问题。而下一个函数memmove则解决了这个问题。


2.memmove

考虑到拷贝自身时,会出现拷贝到一半,源对象作为某一个目标对象从而被改变,需要分情况选择从前往后还是从后往前拷贝。

arr[10]={0,1,2,3,4,5,6,7,8,9};
memmove(arr+2,arr+4,16);

可以发现,将4,5,6,7拷贝到2,3,4,5的位置:

如果从前往后拷贝,arr[10]={0,1,4,5,6,7,6,7,8,9}; 达到预期目标

如果从后往前拷贝,arr[10]={0,1,6,7,6,7,6,7,8,9};发生错误。

所以函数定义时要考虑拷贝方向。

void* memmove(void* dest, void* scr, int count)
{
	assert(dest && scr);
	if (dest > scr)    //后往前拷贝
	{
		while (count--)
		{
			*((char*)dest + count) = *((char*)scr + count);
		}
	}
	else     //从前往后拷贝
	{
		int i = 0;
		while (count--)
		{
			*((char*)dest +i) = *((char*)scr + i);
			i++;
		}
	}
}
int main()
{
	int arr[10] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
	memmove(arr + 2, arr, 20);
	for (int i = 0; i < 10; i++)
	{
		printf("%d ", arr[i]);
	}
	return 0;
}


3.memcmp

memcmp:从给定地址开始比较对象大小,第三个参数为一共比较的字节数。

下图是一个典型的例子。


4.memset

memsen,内存设置函数。可以设定指定地址里面的内容。

要设定的内容,和要设定的字节个数需自己提供。

例如:

 把地址arr往后的20个字节数据,全部改成0。

改变之前,arr往后20个字节存的是 

改变之后,arr往后20个字节存的是 

 

举报

相关推荐

0 条评论