内存函数memcpy、mommove、memset、memcmp

目录

1、memcpy函数

memcpy函数的模拟实现

2、memmove函数

memmove函数的模拟实现

3、memset函数

4、memcmp函数


1、memcpy函数

描述:

C 库函数 void *memcpy(void *str1, const void *str2, size_t n) 从存储区 str2 复制 n 个字节到存储区 str1

声明:

cpp 复制代码
void *memcpy(void *str1, const void *str2, size_t n)

参数:

  • str1 -- 指向用于存储复制内容的目标数组,类型强制转换为 void* 指针。
  • str2 -- 指向要复制的数据源,类型强制转换为 void* 指针。
  • n -- 要被复制的字节数。

返回值:

该函数返回一个指向目标存储区 str1 的指针。

用法:

cpp 复制代码
#include <stdio.h>
#include <string.h>
int main()
{
	int arr1[] = { 1,2,3,4,5,6,7,8,9,10 };
	int arr2[20] = { 0 };
	memcpy(arr2, arr1, 20);
	//20 字节数
	int i = 0;
	for (i = 0; i < 20; i++)
	{
		printf("%d ", arr2[i]);
	}
	

结果:

memcpy函数的模拟实现

cpp 复制代码
#include <stdio.h>
#include <string.h>
#include <assert.h>

void* my_memcpy(void* str1, void* str2, size_t n)
{
	void* ret = str1;
	assert(str1 != NULL);
	assert(str2 != NULL);
	while (n--)
	{
		*(char*)str1 = *(char*)str2;//将str2的字符赋给str1
		str1 = (char*)str1 + 1;//跳到下一个字节
		str2 = (char*)str2 + 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, 20);
	//20 字节数
	int i = 0;
	for (i = 0; i < 20; i++)
	{
		printf("%d ", arr2[i]);
	}
	return 0;
}

这里不能写成str1++,因为str1是void*指针。也不能写成(char*)str1++,因为强转是临时的,但是可以这样写,((char*)str1)++。

结果:

2、memmove函数

和memcpy的差别就是memmove函数处理的源内存块和目标内存块是可以重叠的。

如果原空间和目标空间出现重叠,就得使用memmove函数处理。

描述:

C 库函数 void *memmove(void *str1, const void *str2, size_t n)str2 复制 n 个字符到 str1,但是在重叠内存块这方面,memmove() 是比 memcpy() 更安全的方法。如果目标区域和源区域有重叠的话,memmove() 能够保证源串在被覆盖之前将重叠区域的字节拷贝到目标区域中,复制后源区域的内容会被更改。如果目标区域与源区域没有重叠,则和 memcpy() 函数功能相同。

声明:

cpp 复制代码
void *memmove(void *str1, const void *str2, size_t n)

参数:

  • str1 -- 指向用于存储复制内容的目标数组,类型强制转换为 void* 指针。
  • str2 -- 指向要复制的数据源,类型强制转换为 void* 指针。
  • n -- 要被复制的字节数。

返回值:

该函数返回一个指向目标存储区 str1 的指针。

用法:

cpp 复制代码
#include <stdio.h>
#include <string.h>

int main()
{
	const char dest[] = "oldstring";
	const char src[] = "newstring";

	printf("Before memmove dest = %s, src = %s\n", dest, dest);
	memmove(dest, src, 9);
	printf("After  memmove dest = %s, src = %s\n", dest, dest);

	return(0);
}

结果:

memmove函数的模拟实现

数组的地址是从低到高的

cpp 复制代码
#include <stdio.h>
#include <assert.h>
void* my_memmove(void* str1, const void* str2, size_t n)
{
	assert(str1 != NULL);
	assert(str2 != NULL);
	void* ret = str1;
	if (str1 < str2)
	{
		//从前向后
		while (n--)
		{
			*(char*)str1 = *(char*)str2;
			str1 = (char*)str1 + 1;
			str2 = (char*)str2 + 1;
		}
	}
	else
	{
		//从后向前
		while (n--)
		{
			*((char*)str1 + n) = *((char*)str2 + n);
		}
	}
	return ret;
}

int main()
{
	int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
	my_memmove(arr + 2, arr, 5 * sizeof(int));
	int i = 0;
	for (i = 0; i < 10; i++)
	{
		printf("%d ", arr[i]);
	}
	return 0;
}

3、memset函数

描述:

C 库函数 void *memset(void *str, int c, size_t n) 用于将一段内存区域设置为指定的值。

memset() 函数将指定的值 c 复制到 str 所指向的内存区域的前 n 个字节中,这可以用于将内存块清零或设置为特定值。

在一些情况下,需要快速初始化大块内存为零或者特定值,memset() 可以提供高效的实现。

在清空内存区域或者为内存区域赋值时,memset() 是一个常用的工具函数。

声明;

cpp 复制代码
void *memset(void *str, int c, size_t n)

参数:

  • str -- 指向要填充的内存区域的指针。
  • c -- 要设置的值,通常是一个无符号字符。
  • n -- 要被设置为该值的字符数。

返回值:

该值返回一个指向存储区 str 的指针。

用法:

cpp 复制代码
#include <stdio.h>
#include <string.h>
 
int main ()
{
   char str[50];
 
   strcpy(str,"This is string.h library function");
   puts(str);
 
   memset(str,'$',7);
   puts(str);
   
   return(0);
}

结果:

4、memcmp函数

描述:

C 库函数 int memcmp(const void *str1, const void *str2, size_t n)) 把存储区 str1 和存储区 str2 的前 n 个字节进行比较。

声明:

cpp 复制代码
int memcmp(const void *str1, const void *str2, size_t n)

参数:

  • str1 -- 指向内存块的指针。
  • str2 -- 指向内存块的指针。
  • n -- 要被比较的字节数。

返回值:

  • 如果返回值 < 0,则表示 str1 小于 str2。
  • 如果返回值 > 0,则表示 str1 大于 str2。
  • 如果返回值 = 0,则表示 str1 等于 str2。

用法:

cpp 复制代码
#include <stdio.h>
#include <string.h>

int main ()
{
   char str1[15];
   char str2[15];
   int ret;

   memcpy(str1, "abcdef", 6);
   memcpy(str2, "ABCDEF", 6);

   ret = memcmp(str1, str2, 5);

   if(ret > 0)
   {
      printf("str2 小于 str1");
   }
   else if(ret < 0) 
   {
      printf("str1 小于 str2");
   }
   else 
   {
      printf("str1 等于 str2");
   }
   
   return(0);
}

结果:

str2 小于 str1

相关推荐
谢尔登6 分钟前
【React】useId
前端·javascript·react.js
qq_336411758 分钟前
【笔记】Chrome浏览器的性能调试(performance)工具使用和代码优化
前端·chrome·笔记
与己斗其乐无穷19 分钟前
刷题记录(7)二叉树
数据结构·算法
NoneCoder19 分钟前
Redux 实践与中间件应用
前端·react.js·中间件·面试
luofeiju20 分钟前
矩阵QR分解
线性代数·算法
蓝胖子的多啦A梦26 分钟前
Vue3 (数组push数据报错) 解决Cannot read property ‘push‘ of null报错问题
前端·vue3·push·数组数据
Neil今天也要学习30 分钟前
永磁同步电机无速度算法--基于卡尔曼滤波器的滑模观测器
算法
祯民31 分钟前
入职阿里云一个月后,我有了新的人生体验
前端·面试·trae
鑫鑫向栄35 分钟前
[蓝桥杯]整理玩具
数据结构·c++·算法·蓝桥杯·动态规划
iiismobi38 分钟前
React项目的状态管理:Redux Toolkit
前端·react.js·前端框架·redux toolkit