首页 > 系统相关 >59.【C语言】内存函数(memmove函数)

59.【C语言】内存函数(memmove函数)

时间:2024-09-21 09:21:09浏览次数:11  
标签:src arr 59 函数 memmove dest char num

2.memove函数

*简单使用

memove:memory move

cplusplus的介绍 点我跳转

对比第59篇的memcpy函数

对比memmcpy函数的介绍如下区别:

部分翻译

memmove多了:Copying takes place as if an intermediate buffer were used(复制就像中间的缓存区使用一样), allowing the destination and source to overlap.

memcpy多了:, and should not overlap (for overlapping memory blocks, memmove is a safer approach).

说明memmove允许source指针和destination指针有重叠

将arr[0]~arr[4]的内容复制到arr[2]~arr[6]中

#define   _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>
int main()
{
	int arr1[] = { 1,2,3,4,5,6,7,8,9,10 };
	memmove(arr1+2, arr1, 5* sizeof(int));
	return 0;
}

*模拟实现

设计一个函数sim_memmove,参数及类型与memmove相同

方案1

线索:上方cplusplus的翻译

可以在函数中设计一个缓存区数组buffer来转移数据

#define   _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>
void* sim_memmove(void* dest, const void* src, size_t num)
{
	char buffer[1000] = { 0 };//最多移动1000个字符
	//s_src是save_source的缩写
	const char* s_src = (const char*)src;
	//s_dest是save_destination的缩写
	char* s_dest = (char*)dest;//保存返回值
	for (size_t i = 0; i < num; i++)
	{
		buffer[i] = s_src[i];//s_src已经被强制类型转换过了,不用在循环的时候进行
	}
	src = s_src;
	for (size_t i = 0; i < num; i++)
	{
		s_dest[i] = buffer[i];
	}
	return dest;

}

int main()
{
	int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
	sim_memmove(arr+2, arr, 5* sizeof(int));
	return 0;
}

如果想让程序更安全

可以在开头加上:

// 如果 dest 和 src 重叠
if (dest == NULL || src == NULL || num == 0) 
{
	return dest;
}

// 确保不超过 1000 字节
if (num > 1000) 
{
	return NULL; // 或者可以返回一个错误码
}

方案2

方案1可以优化,设计一个buffer数组会占用空间,只是需要考虑复制的方向

分为dest和src的部分是否有重叠进行讨论

1.有重叠
dest在src左侧

从src前向后复制,防止重叠

dest在src右侧

从src后向前复制,防止重叠

2.无重叠

从src前向后复制或从src后向前复制均可

比较dest和src的大小关系即可

代码
#define   _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>
void* sim_memmove(void* dest, const void* src, size_t num)
{
	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 dest;

}

int main()
{
	int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
	sim_memmove(arr + 2, arr, 5 * sizeof(int));
	return 0;
}

标签:src,arr,59,函数,memmove,dest,char,num
From: https://blog.csdn.net/2401_85828611/article/details/142379636

相关文章

  • PSPICE仿真滤波器及仿真过程中的各种问题!如何写出一个滤波器的传递函数!
    前言:最近在学习滤波器,包括各种低通滤波器、高通滤波器、带阻、带通等等,以及一些常见的拓扑sallenkey结构、多反馈、Bainter陷波器等等。于是想着通过一个仿真的模型开始,到最后使用芯片做出实物这样一个学习过程。对于简单的设计我首选ADI的滤波器设计向导,他们能够提供许多......
  • 代码随想录算法训练营第一天 | 209. 长度最小的子数组 59. 螺旋矩阵 58. 区间和 Java
    209.长度最小的子数组题目链接:https://leetcode.cn/problems/minimum-size-subarray-sum/description/解题思路思路1:暴力解法通过两个for循环,找出所有的可能的区间,并比较出最小区间思路2:滑动窗口因为需要找出的是连续的一个子数组,所以可以模拟一个从左到右滑动的一个......
  • Leetcode #允许一个函数调用
    给定一个函数fn,返回一个与原始函数相同的新函数,除了它确保fn最多被调用一次。第一次调用返回的函数时,它应该返回与fn相同的结果。随后每次调用它时,它都应该返回未定义。示例1:输入:fn=(a,b,c)=>(a+b+c),调用=[[1,2,3],[2,3,6]]输出:**explanation:**登录后复制const......
  • JavaScript 中的高阶函数
    什么是高阶函数?高阶函数是可以接受其他函数作为参数或返回函数作为值的函数。它们为我们提供了一种强大的方法来编写可应用于各种场景的可重用代码。javascript有几个常用的高阶函数,包括map()、filter()和reduce()。由于存在高阶函数,javascript通常被称为函数式编程语言。高阶......
  • Qt基础操作槽函数
    在"dialog.cpp"文件的构造函数中添加如下代码:```cppinputBtn=newQPushButton;inputBtn->setText(tr("标准输入对话框实例"));添加布局管理:mainLayout->addWidget(inputBtn,3,0);最后添加事件关联://创建控件的对象//布局设计connect(inputBtn,SIGNAL(clicke......
  • python函数三:拆包和交换变量值、引用、匿名函数
    文章目录1.拆包和交换变量值1.1拆包1.2交换变量值2.引用2.1了解引用2.1把引用当作参数传递3.匿名函数3.1lambda语法3.2lambda的应用3.3使用使用函数形式来求解某天是该年的第几天?1.拆包和交换变量值1.1拆包拆包:把组合形成的元组形式的数据,拆分出单个......
  • python函数
    函数函数是组织好的,可重复使用,用来实现单一,或相关联功能的代码段def函数名()1无参数defhs1():print(1)hs1()#12有单个参数defhs1(a):print(a+1)hs1(2)#33有多个参数defhs1(a,b):print(a+b)hs1(2,3)#54默认参数defhs1(a,b=18):print(a+b)hs1(2)#20......
  • Excel--DATEDIF函数的用法及参数含义
    DATEDIF函数的用法为:DATEDIF(start_date,end_date,unit),start_date表示的是起始时间,end_date表示的是结束时间。unit表示的是返回的时间代码,是天、月、年等。如下:Datedif函数的参数含义unit参数返回值的意义"y"两个时间段之间的整年数"m"两个时间段之间的整月数"d"两个时......
  • 函数及其所有相关知识点详解及实例
    一、JavaScript函数基础在JavaScript中,函数是一等公民,这意味着函数可以像其他数据类型一样被传递和操作。函数可以封装代码块,提高代码的复用性和解耦性。1.函数声明定义函数: function自定义函数名(){}调用函数: 函数名()functionadd(a,b){returna+b......
  • 使用MongoDB存储和查询数据的Python函数实现
    使用MongoDB存储和查询数据的Python函数实现MongoDB是一种流行的NoSQL数据库,因其灵活的文档存储和高性能查询能力而广受欢迎。在本文中,我们将详细介绍如何使用Python实现一个函数来存储和查询MongoDB中的数据。本文将涵盖MongoDB的基本概念、Python与MongoDB的连接、数据的......