内存操作函数(memcpy,memmove,memset)


一,函数介绍

void*是什么意思?有什么作用?,如果不理解的话可以跳转:void*是什么意思?有什么作用?

1.memcpy

函数原型:

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

memcpy函数是一种对内存进行拷贝的函数拷贝的单位是字节。

参数介绍:

source:模板;
destination:目的地;
num:表示需要拷贝的字节数。(必须是大于等于0的整数)

简单来说就是将source指向的内存块的值拷贝至destination指向的内存块,至于拷贝多大的内存就看num有多大单位字节。


2.memmove

函数原型:

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

参数介绍:

source:模板;
destination:目的地;
num:表示需要拷贝的字节数。(必须是大于等于0的整数)

简单来说就是将source指向的内存块的值拷贝至destination指向的内存块,至于拷贝多大的内存就看num有多大单位字节。

没错memcpy和memmove非常的相你可以近似地把memmove当成memcpy的升级版

memmove和memcpy的区别:

memcpy中如果source和destination有任何的重叠,复制的结果都是未定义的,也就是说memcpy只能对

没有任何重叠的两块内存进行拷贝。

memmove和memcpy的差别就是memmove函数处理的

源内存块和目标内存块是可以重叠的。

但是有些编译器中memcpy也可以对重叠的内存进行拷贝

3.memset

函数原型:

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

参数介绍:

这个函数其实就是将ptr指向的内存空间的num个字节改成value(注:value是ASCII码)


二,使用c语言进行模拟实现(部分)

1.memcpy

#define _CRT_SECURE_NO_WARNINGS 1


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


void Memcpy(void* arr, const void* a, size_t num)
{
    
    
	assert(arr != NULL);
	assert(a != NULL);
	for (int i = 0; i < num; i++)
	{
    
    
		*(char*)arr = *(char*)a;
		arr = (char*)arr + 1;
		a = (char*)a + 1;
	}
}
int main()
{
    
    
	char arr[10] ="ahah";
	char a[] = "ss";
	Memcpy(arr, a, 2);


	printf("%s", arr);
	return 0;
}

2.memmove

#define _CRT_SECURE_NO_WARNINGS 1


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


void* Memmove(void* arr, const void* a, size_t num)
{
    
    
	assert(arr != NULL);
	assert(a != NULL);
	void* p = arr;
	if (arr > a)
	{
    
    
		while (num--)
		{
    
    
			*((char*)arr + num) = *((char*)a + num);
		}
	}
	else
	{
    
    
		for (int i = 0; i < num; i++)
		{
    
    
			*(char*)arr = *(char*)a;
			arr = (char*)arr + 1;
			a = (char*)a + 1;
		}
	}
	return p;
}
int main()
{
    
    
	char arr[10] ="abcdef";
	Memmove(arr, arr+2, 3);


	printf("%s", arr);
	return 0;
}

猜你喜欢

转载自blog.csdn.net/2302_76339343/article/details/131661450
今日推荐