jamiechoo

 

C/C++ memcpy、memmove、memcmp、memset内存操作函数使用

6 内存操作函数

今天来讲一下内存操作函数,与字符串的操作函数类似。在字符串函数中有字符串拷贝(strcpy),字符串比较(strcmp),那么在内存操作函数中,同样也有类似的操作函数,那么接下来我们就来看看这些内存操作函数如何去使用吧。

6.1 memcpy - 内存拷贝函数(不重叠)

6.1.1 函数原型

void *memcpy( void *dest,    const void *src,    size_t count ); 

memcpy函数的第一个参数dest是目标缓冲区,也就是你想要将复制的内存放到哪个内存变量里;第二个参数src就是需要复制的内容;第三个参数是在第二个参数里选取count个字节来复制内容。

6.1.2 注意

memcpy函数应该拷贝的是不重叠的内存,也就是说目标指针不能使用原来的指针。(而在VS编译器中既可以拷贝不重叠的内存,也可以拷贝重叠的内存)

6.1.3 函数使用样例

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

void* my_memcpy(void* dest, const void* src, int num)
{
	void* ret = dest;
	assert(dest && src);
	while (num--)
	{
		*(char*)dest = *(char*)src;
		dest = (char*)dest + 1;
		src = (char*)src + 1;
	}
	return ret;
}
int main()
{
	int arr1[10] = { 1,2,3,4,5,6,7,8,9,10 };
	int arr2[10] = { 0 };
	//(目标,来源,拷贝的字节数)
	my_memcpy(arr2, arr1, 20);
	int i = 0;
	for (i = 0; i < 10; i++)
		printf("%d ", arr2[i]);
	return 0;
}

代码执行结果:

 

6.2 memmove - 内存拷贝函数(重叠)

6.2.1 函数原型

void *memmove( void *dest, const void *src,    size_t count ); 

memmove函数的第一个参数dest是目标缓冲区,也就是你想要将复制的内存放到哪个内存变量里;第二个参数src就是需要复制的内容;第三个参数是在第二个参数里选取count个字节来复制内容

6.2.2 注意

看完memmove函数之后,是不是觉得这跟memcpy没什么两样?怎么连形参都是一样的呢?确实,memmove函数就是在memcpy的基础上,优化了可以处理内存重叠的情况。

6.2.3 函数使用样例

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

void* my_memmove(void* dest, const void* src, int num)
{
	assert(dest && src);
	void* ret = dest;
	if (dest < src)
	{
		while (num--)
		{
			*(char*)dest = *(char*)src;
			dest = (char*)dest + 1;
			src = (char*)src + 1;
		}
	}
	else
	{
		while (num--)
		{
			*((char*)dest+num) = *((char*)src+num);
		}
	}
	return ret;
}
int main()
{
	int arr1[10] = { 1,2,3,4,5,6,7,8,9,10 };
	//(目标,来源,拷贝的字节数)
	my_memmove(arr1+2, arr1, 20);
	int i = 0;
	for (i = 0; i < 10; i++)
		printf("%d ", arr1[i]);
	//1 2 1 2 3 4 5 8 9 10

	return 0;
}

代码执行结果:

 

6.3 memcmp - 内存比较函数

6.3.1 函数原型

int memcmp( const void * buf1 , const void * buf2 , size_t count ); 

memcmp函数前两个参数是需要比较大小的内存指针,第三个参数是需要比较的字节数,最后并返回一个int型。

1.buf1 < buf2 --> return int ( < 0 )

2.buf1 = buf2 --> return int ( = 0 )

3.buf1 > buf2 --> return int ( > 0 )

6.3.2 注意

memcmp函数的头文件是string.h或memeory.h;与字符串比较函数类似,返回整型。

6.3.3 函数使用样例

#include<stdio.h>

int main()
{
	float arr1[] = { 1.0,2.0,3.0,4.0 };
	float arr2[] = { 1.0,3.0 };
	int ret1 = memcmp(arr1, arr2, 4);//0
	int ret2 = memcmp(arr1, arr2, 8);//-1
	printf("%d\t%d", ret1, ret2);
	return 0;
}

代码执行结果: 

 6.4 memset - 内存设置函数

6.4.1 函数原型

 
arduino
代码解读
复制代码
void *memset( void * dest , int c , size_t count  ); 

memset函数的第一个参数是需要被初始化的内存指针,第二个参数是需要对内存初始化成什么整型值,第三个参数则是内存需要初始化的字节数。

6.4.2 注意

初始化的内存可以是任意类型,字节数是该内存的大小。

6.4.3 函数使用样例

 
arduino
代码解读
复制代码
#include<stdio.h>
#include<string.h>

int main()
{
	int arr[10] = { 0 };
	memset(arr, 1, 20);
        //(对象,赋值,字节数)
	return 0;
}

代码执行可在调试中观察。

 

posted on 2024-11-29 19:30  jamiechoo  阅读(293)  评论(0)    收藏  举报

导航