C语言内存函数

memcpy使用和模拟实现

  1. memcpy函数
    在这里插入图片描述
    2.功能:
  • memcpy是完成内存块拷贝的,不关注内存中存放的数据是啥
  • 函数memcpy从source的位置开始向后复制num个字节的数据到destination指向的内存位置
  • 如果source和destination有任何的重叠,复制的结果都是未定义的
  • memcpy的使用需要包含<string.h>
  1. 使用:
    在这里插入图片描述

memcpy的模拟实现

代码实现:

#include<stdio.h>
#include<assert.h>
void* my_memcpy(void* dest, const void* src, size_t num)
{
	void* ret = dest;
	assert(dest && src);
	while (num--)
	{
		*(char*)dest = *(char*)src;
		src = (char*)src + 1;
		dest = (char*)dest + 1;
	}
	return ret;
}
int main()
{
	int arr1[] = { 1,2,3,4,5,6,7,8,9,10 };
	int arr2[20] = { 0 };
	my_memcpy(arr2, arr1, 40);
	return 0;
}

内存:
在这里插入图片描述

memmove使用和模拟实现

  1. memmove函数
    在这里插入图片描述
  2. 功能:
  • memmove函数也是完成内存块拷贝
  • 和memcpy的区别在于memmove函数处理的源内存块和目标内存块是可以重叠的
  • memmove的使用需要包含<string.h>
  1. 基本使用
  • 内存不重叠
    在这里插入图片描述
  • 内存重叠
    在这里插入图片描述

memmove的模拟实现

(1). 在模拟实现时,如图:
在这里插入图片描述
现在我们就得到两种方法:

  • 1:若目标内存块在第一块区域或第三块区域,从前向后拷贝;在第二块区域,从后向前拷贝。
  • 2:若目标内存块在第一块区域,从前向后拷贝;在第二块区域或第三块区域,从后向前拷贝。

(2). 我们使用第二种方法,实现一下代码:
在这里插入图片描述

#include<stdio.h>
#include<assert.h>
void* my_memmove(void* dest, const void* src, size_t 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 arr[] = { 1,2,3,4,5,6,7,8,9,10 };
	my_memmove(arr + 2, arr, 20);
	return 0;
}

在这里插入图片描述

memset使用

  1. memset函数
    在这里插入图片描述
  2. 功能:
  • memset函数是用来设置内存块的内容的,以字节为单位,将内存中指定长度的空间设为特定的内容
  • memset的使用需包含<string.h>
  1. 使用举例:
    在这里插入图片描述

memcmp使用

  1. memcmp函数:
    在这里插入图片描述
  2. 功能:
  • 比较指定的两块内存块的内容,比较从ptr1和ptr2指针指向的位置开始,向后的num个字节
  • memcmp的使用需要包含<string.h>
  1. 返回值:
    在这里插入图片描述
    4.使用举例:
    在这里插入图片描述
    前十六个字节相同,所以==
    在这里插入图片描述
Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐