【C语言进阶】内存函数

目录

1.memcpy函数

[1.1 模拟实现](#1.1 模拟实现)

2.memmove函数

3.memcmp函数


1.memcpy函数

字符串拷贝strcpy和strncpy是有一定局限性的,只能拷贝字符串,而memcpy可以拷贝任意类型的数据,单位是字节。

1.1 模拟实现

cpp 复制代码
#include<stdio.h>
#include<assert.h>
// 返回目标空间的的首地址
void* my_memcpy(void* des,void* src,size_t num) 
{
	assert(des && src);
	void* ret = des;
	while (num--)
	{
		*((char*)des) = *((char*)src);
		((char*)des)++;
		((char*)src)++;
	}
	return ret;
}

int main() 
{
	int arr1[] = { 1, 2, 3, 4, 5, 6, 7 };
	int arr2[20] = { 0 };
	my_memcpy(arr2, arr1, sizeof(arr1));
	return 0;
}

2.memmove函数

我们发现:自己实现的memcpy不能实现自己拷贝自己,这是因为在逐字节拷贝的时候,后面的元素再去拷贝前面的字节,前面的字节已经被改过了;但是库函数是可以自己拷贝自己的。

memmove能够实现自己拷贝自己

2.1 模拟实现

情况1:dest < src,此时应该从前向后拷贝,这样就会避免,拷贝修改之后的值。

情况2:当des > src,此时从后往前拷贝。

总体区域划分:

方案①:1、3区域从前往后拷贝;2区域从后往前拷贝;

方案②:1区域从前向后(dest > src);23区域从后往前拷贝(dest < src);

这里采用方案②,只需要判断dest 和 src的大小即可。

cpp 复制代码
#include<stdio.h>
#include<string.h>
#include<assert.h>
void* my_memmove(void* dest, void* src, size_t num)
{
	assert(dest && src);
	void* ret = dest;
	if (dest <  src)
	{
		while (num--)
		{
			// 从前向后拷贝
			*((char*)dest) = *((char*)src);
			((char*)dest)++;
			((char*)src)++;
		}
	}
	else
	{
		while (num--)
		{
			// 从后向前拷贝,最后一个->倒数第二个
			*((char*)dest + num) = *((char*)src + num);
		}
	}
	return ret;
}


int main()
{
	int arr1[] = { 1, 2, 3, 4, 5, 6, 7 ,8,9,10 };
	int arr2[20] = { 0 };
	//my_memcpy(arr2, arr1, sizeof(arr1));
	my_memmove(arr1, arr1 + 3, 12);
	int i = 0;
	for(i = 0;i < 10;i++)
	{
		printf("%d\n", arr1[i]);
	}
	return 0;
}

3.memcmp函数

第一个数组的内存中的数据比第二个内存中的数据要大。

4.memset函数

使用来初始化内存的,第一个参数是起始地址,第二个参数是初始化的值,第三个是初始化的字节个数。

需要注意的是,这里的初始化是按照字节初始化的,所以尽量给一个字节类型的数据。

相关推荐
ZTLJQ2 小时前
序列化的艺术:Python JSON处理完全解析
开发语言·python·json
2401_891482172 小时前
多平台UI框架C++开发
开发语言·c++·算法
88号技师3 小时前
2026年3月中科院一区SCI-贝塞尔曲线优化算法Bezier curve-based optimization-附Matlab免费代码
开发语言·算法·matlab·优化算法
t198751283 小时前
三维点云最小二乘拟合MATLAB程序
开发语言·算法·matlab
nap-joker3 小时前
【多模态解耦】DecAlign:用于解耦多模态表示学习的分层跨模态对齐
学习·多模态融合·最优传输·多模态表征学习·特征解耦·音频+图像+文本·原型引导
无敌昊哥战神3 小时前
【LeetCode 257】二叉树的所有路径(回溯法/深度优先遍历)- Python/C/C++详细题解
c语言·c++·python·leetcode·深度优先
551只玄猫3 小时前
【数据库原理 实验报告1】创建和管理数据库
数据库·sql·学习·mysql·课程设计·实验报告·数据库原理
m0_726965983 小时前
面面面,面面(1)
java·开发语言
x_xbx3 小时前
LeetCode:148. 排序链表
算法·leetcode·链表
Darkwanderor3 小时前
三分算法的简单应用
c++·算法·三分法·三分算法