【C语言】常见的内存操作函数

前言:

紧接字符串函数,接下来介绍内存函数~~
————————————————————

1.memcpy

memcpy函数介绍

在这里插入图片描述
memcpy函数的作用是内存拷贝

  • 函数memcpy从source的位置开始向后复制num个字节的数据到destination的内存位置。
  • 这个函数在遇到 ‘\0’ 的时候并不会停下来。
  • 如果source和destination有任何的重叠,复制的结果都是未定义的。

memcpy函数的使用:

int main()
{
    
    
	int arr1[] = {
    
     1,2,3,4,5 };
	int arr2[10] = {
    
     0 };
	memcpy(arr2, arr1, 16);
	int i = 0;
	for (i = 0; i < 10; i++)
	{
    
    
		printf("%d ", arr2[i]);
	}
	return 0;
}

打印结果:
在这里插入图片描述
整型数值一个元素4个字节,传过去16个字节即打印arr1里面的前4个元素,其他补0(可以拷贝整型数组、字符串和结构体,因为void * 的指针可以接收任意数据)

memcpy函数的模拟实现

void* my_memcpy(void* dest, const void* str, size_t num)
{
    
    
	assert(dest && str);
	void* t = dest;
	while (num--)
	{
    
    
		*(char*)dest = *(char*)str;
		dest = (char*)dest + 1;
		str = (char*)str + 1;
	}
	return t;
}
int main()
{
    
    
	int arr1[] = {
    
     1,2,3,4,5,6,7 };
	int arr2[10] = {
    
     0 };
	my_memcpy(arr2, arr1, 24);
	int i = 0;
	for (i = 0; i < 10; i++)
	{
    
    
		printf("%d ", arr2[i]);
	}
	return 0;
}

函数拷贝结束后,返回目标空间的起始地址
void * 可以接收任意数据类型,把它转换成char *,因为char类型的大小为1个字节,可以一个一个的接收某个数据类型(传过来的数据类型不确定),直到拷贝结束,返回目标空间的起始地址。

2.memmove

memmove函数介绍

在这里插入图片描述

memmove函数的参数与memcpy相同

  • 和memcpy的差别就是memmove函数处理的源内存块和目标内存块是可以重叠的。
  • 如果源空间和目标空间出现重叠,就得使用memmove函数处理。

memmove函数的使用:

int main()
{
    
    
	int arr1[] = {
    
     1,2,3,4,5,6,7,8,9,10 };
	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;
}

memmove函数可以拷贝重叠的数组,从arr1第三个元素的地址开始拷贝,拷贝的数据从arr1首元素开始,拷贝的个数为6个,最后打印10个元素。

如果改成:

memmove(arr1, arr1 + 2, 20);.//3 4 5 6 7 6 7 8 9 10

就是从arr1的首元素地址开始拷贝,拷贝的数据从arr1的第三个元素开始,拷贝的个数为6个,最后打印10个元素。

memmove函数的模拟实现

void* my_memmove(void* dest, const void* str, size_t num)
{
    
    
	assert(dest && str);
	void* t = dest;
	if (dest < str)
	{
    
    
		while (num--)
		{
    
    
			*(char*)dest = *(char*)str;
			dest = (char*)dest + 1;
			str = (char*)str + 1;
		}
	}
	else
	{
    
    
		while (num--)
		{
    
    
			*((char*)dest + num) = *((char*)str + num);
		}
	}
	return t;
}
int main()
{
    
    
	int arr1[] = {
    
     1,2,3,4,5,6,7,8,9,10 };
	my_memmove(arr1 + 2, arr1, 20);//从后向前拷贝
	//my_memmove(arr1, arr1 + 2, 20);//从前向后拷贝
	int i = 0;
	for (i = 0; i < 10; i++)
    {
    
    
		printf("%d ", arr1[i]);
	}
	return 0;
}

重叠拷贝有两种情况:(防止拷贝的元素有重叠)
1.从前向后拷贝;
2.从后向前拷贝。
在这里插入图片描述
如果dest<str,从前向后拷贝;反之,则从后向前拷贝。

3.memcmp

在这里插入图片描述
memcmp函数的作用是内存比较
比较从ptr1和ptr2指针开始的num个字节
返回值如下:
在这里插入图片描述
比较的字节相同,返回0;
比较的字节ptr1大于ptr2,返回>0;
比较的字节ptr1小于ptr2,返回<0;

memcmp函数的使用:

int main()
{
    
    
	int arr1[] = {
    
     1,2,1,4,5,6 };
	int arr2[] = {
    
     1,2,257 };
	int len = memcmp(arr1, arr2, 9);
	printf("%d\n", len);
	return 0;
}

返回的结果是0,它是一个字节一个字节比较的
在这里插入图片描述

4.memset

在这里插入图片描述
memset函数的作用是把ptr指向的前num个字节的内容设置成value的值(把value的值以字节为单位一个一个放到ptr里)

memset函数的使用:

int main()
{
    
    
	char arr[] = "abcdefgh";
	memset(arr + 2, 'y', 3);
	printf("%s\n", arr);
	return 0;
}

打印结果:
在这里插入图片描述
arr+2:指向arr的第三个元素,从这开始设置要设置的值;
‘y’:要设置的值;
3:设置3个,从字符c开始把cde设置为字符y

感谢观看~~
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/2301_77459845/article/details/131848055
今日推荐