当前位置: 首页 > news >正文

58.【C语言】内存函数(memcpy函数)

目录

1.memcpy

*简单使用

翻译:

*模拟实现

注意事项:

*例题


1.memcpy

*简单使用

memcpy:memory copy

cplusplus的介绍 点我跳转

翻译:

函数

memcpy


void * memcpy ( void * destination, const void * source, size_t num );

复制内存块

直接从source指向的位置复制num个字节到destination指向的内存块(memory block)

由destination和source指针指向对象的潜在类型与这个函数无关(因为destination和source的类型为void*,没有限制);结果是以二进制复制的数据

这个函数不检查由sorce指向的字符串中的\0(即"免疫"\0) - 总是精确复制num个字节

为了避免溢出,由destination和source指针指向的数组应该至少为num个字节,而且两者不能重叠(对于重叠的内存块,memmove是一种更安全的方法)

参数


目标(destination):指向内容需要复制的目标数组,类型转换至一个void*类型的指针

源(source):指向要被复制的源的数据,类型转换至一个const void*类型的指针

个数(num):要复制的字节个数,size_t是无符号整型

返回值


目标被返回

#define   _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>
int main()
{int arr1[] = { 1,2,3,4 };int arr2[4] = { 0 };memcpy(arr2, arr1, 2 * sizeof(int));//拷贝arr1的前两个元素return 0;
}

注意:arr1一个元素占4个字节,应用sizeof(int)来控制复制的元素个数

 

*模拟实现

设计一个函数sim_memcpy,和memcpy一样有3个参数

destination简写为dest,source简写为src

#define   _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <assert.h>
void* sim_memcpy(void* dest, const void* src, size_t num)
{void* ret = dest;//设置返回值assert(dest && src);//确保不是空指针while (num--){//要以字节为单位复制,就要强制类型转换为char**(char*)dest = *(char*)src;dest = (char*)dest + 1;src = (char*)src + 1;}return ret;
}int main()
{int arr1[] = { 1,2,3,4 };int arr2[4] = { 0 };sim_memcpy(arr2, arr1, 2 * sizeof(int));//拷贝arr1的前两个元素return 0;
}

下断点调试后

注意事项:

1.

指针移动时不能按上方的图来写,void*没有指定类型,无法进行运算

修改过后任然无法通过,显示error C2036: “void *”: 未知的大小

优先级:++ > 强制类型转换,dest++ 会先执行自增操作,然后再将 dest 的值转换为 char*。但是这种写法并不能达到预期的效果,因此显示错误

改为即可

2.void类型的函数和void*类型的函数有区别

void类型的函数不用返回值

void*类型的函数返回一个指向某种类型(任意类型,不需要强制类型转换)的指针

*例题

欲将arr[0]~arr[4]的内容复制到arr[2]~arr[6]中,以下代码是否能成功执行?

#define   _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <assert.h>
void* sim_memcpy(void* dest, const void* src, size_t num)
{void* ret = dest;//设置返回值assert(dest && src);//确保不是空指针while (num--){//要以字节为单位复制,就要强制类型转换为char**((char*)dest) = *((char*)src);dest = (char*)dest + 1;src = (char*)src + 1;}return ret;
}int main()
{int arr[] = { 1,2,3,4,5,6,7,8,9,10 };sim_memcpy(arr+2, arr, 5* sizeof(int));return 0;
}

答案速查:

分析:

由于指针有重叠,内容被覆盖,所以不行

但调用VS的memcpy没有出现这样的情况

说明VS制作的memcpy函数超过了C11的标准

相关文章:

58.【C语言】内存函数(memcpy函数)

目录 1.memcpy *简单使用 翻译: *模拟实现 注意事项: *例题 1.memcpy *简单使用 memcpy:memory copy cplusplus的介绍 点我跳转 翻译: 函数 memcpy void * memcpy ( void * destination, const void * source, size_t num ); 复制内存块 直接从source指向的位置复制num…...

rust一些通用编程的概念

rust一些通用编程的概念 官网文档数据类型 - Rust 程序设计语言 中文版 (rustwiki.org) 变量&#xff0c;数据类型&#xff0c;条件判断&#xff0c;循环 变量 rust中变量的可变性是值得注意的 例如: fn main(){let number 1;number 2;println!("the number is {}&quo…...

SpringBoot基础知识

谈一谈你对SpringBoot的理解&#xff0c;它有哪些特性&#xff08;优点&#xff09;&#xff1f; SpringBoot用来快速开发Spring应用的一个脚手架&#xff0c;其目的是用来简化新Spring应用的初始搭建以及开发过程。 优点&#xff1a; 简化配置&#xff1a;提供了很多内置的…...

ubuntu配置libtorch CPU版本

配置环境&#xff1a;Ubuntu 20.04Date&#xff1a;2024 / 08 1、下载最新版本的libtorch wget https://download.pytorch.org/libtorch/nightly/cpu/libtorch-shared-with-deps-latest.zip unzip libtorch-shared-with-deps-latest.zip2、创建一个C工程文件夹&#xff0c;目…...

Docker MySql 数据备份、恢复

docker-compose.yaml实例 version: 3.8 services:db:image: mysql:9.0.1environment:MYSQL_ROOT_PASSWORD: 123456MYSQL_DATABASE: dataMYSQL_USER: dataMYSQL_PASSWORD: 123456MYSQL_ROOT_HOST: % 1、备份 docker exec -it <容器名称> /usr/bin/mysqldump -u root -p12…...

django项目添加测试数据的三种方式

文章目录 自定义终端命令Faker添加模拟数据基于终端脚本来完成数据的添加编写python脚本编写shell脚本执行脚本需要权限使用shell命令来完成测试数据的添加 添加测试数据在工作中一共有三种方式&#xff1a; 可以根据django的manage.py指令进行[自定义终端命令]可以采用第三方…...

用Python提取PDF表格到Excel文件

在对PDF中的表格进行再利用时&#xff0c;除了直接将PDF文档转换为Excel文件&#xff0c;我们还可以提取PDF文档中的表格数据并写入Excel工作表。这样做可以避免一些不必要的文本和格式带来的干扰&#xff0c;获得更易于分析和处理的表格数据&#xff0c;并方便进行更多的格式设…...

Java基础|多线程:多线程分页拉取

前言&#xff1a; 通常我们都会遇到分页拉取的需求&#xff0c;比如与第三方系统同步数据&#xff0c;定时拉取全量数据做缓存&#xff0c;下面我们简单介绍下多线程分页写法 需求&#xff1a; 全量同步第三方系统数据&#xff0c;并在全部数据同步完后&#xff0c;统一做缓存…...

Android RecyclerView 实现 GridView ,并实现点击效果及方向位置的显示

效果图 一、引入 implementation com.github.CymChad:BaseRecyclerViewAdapterHelper:2.9.30 二、使用步骤 1.Adapter public class UnAdapter extends BaseQuickAdapter<UnBean.ResultBean, BaseViewHolder> {private int selectedPosition RecyclerView.NO_POSITIO…...

Centos中dnf和yum区别对比

dnf和yum是两种不同的包管理工具&#xff0c;它们各自具有独特的特点和优势&#xff0c;主要用于在Linux系统上安装、更新和卸载软件包。以下是dnf和yum之间的主要区别&#xff1a; 1. 依赖关系解决 dnf&#xff1a;dnf在处理依赖关系方面表现出更强的能力。它能够更高效地解…...

CVPT: Cross-Attention help Visual Prompt Tuning adapt visual task

论文汇总 当前的问题 图1:在VTAB-1k基准测试上&#xff0c;使用预训练的ViT-B/16模型&#xff0c;VPT和我们的CVPT之间的性能和Flops比较。我们将提示的数量分别设置为1、10、20、50,100,150,200。 如图1所示&#xff0c;当给出大量提示时&#xff0c;VPT显示了性能的显著下降…...

基于双向 LSTM 和 CRF 的序列标注模型

基于双向 LSTM 和 CRF 的序列标注模型 在自然语言处理中,序列标注是一项重要的任务,例如命名实体识别、词性标注等。本文将介绍如何使用 Keras 构建一个基于双向 LSTM 和 CRF 的序列标注模型。 一、引言 序列标注任务要求为输入序列中的每个元素分配一个标签。传统的方法可…...

为何美国与加拿大边界看似那么随意?

我们在《日本移民巴西超200万&#xff0c;会成第二个“巴勒斯坦”吗&#xff1f;》一文中探讨了日本移民巴西的历史&#xff0c;以及移民对巴西的风险与挑战。 今天我们来探讨美国与加拿大边界为什么那么随意,并整理了加拿大和美国的国界、省界、市界行政边界数据分享给大家&a…...

什么是触发器(Trigger)?触发器何时会被触发?

在数据库管理系统中&#xff0c;触发器是一种特殊的存储过程&#xff0c;它会在特定的表上执行插入、更新或删除操作时自动触发。 触发器的主要用途是维护数据的一致性和完整性&#xff0c;以及实现一些复杂的业务逻辑。 触发器何时会被触发&#xff1f; 触发器可以在以下几…...

一步一步优化一套生成式语言模型系统

以下是这套生成式语言模型解决任务的流程图概述&#xff1a; #mermaid-svg-keXg8yGoCyObKDtu {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-keXg8yGoCyObKDtu .error-icon{fill:#552222;}#mermaid-svg-keXg8yGoCyO…...

Q必达任务脚本

文章目录 1.购买服务器地址2.部署教程3. 代码如下4. 如何联系我 1.购买服务器地址 服务器购买地址 https://t.aliyun.com/U/rUHk58 若失效&#xff0c;可用地址 https://www.aliyun.com/activity/wuying/dj?source5176.29345612&userCode49hts92d 2.部署教程 2024年最…...

问请问请问2312123213123

&#x1f4e2;博客主页&#xff1a;https://blog.csdn.net/2301_779549673 &#x1f4e2;欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1f4dd; 如有错误敬请指正&#xff01; &#x1f4e2;本文由 JohnKi 原创&#xff0c;首发于 CSDN&#x1f649; &#x1f4e2;未来很长&#…...

Vue3:快速生成模板代码

目录 一.模板代码 1.提供基础结构 2.定义组件名称 3.初始化数据和方法 4.应用样式 5.提高开发效率 二.操作 1.点击右下角设置按钮选择代码片段 2.输入vue.json&#xff0c;打开vue.json文件 3.构造模板 4.模板代码 5.使用 6.效果 一.模板代码 Vue3快速生成模板代…...

文件上传-php

查找方式 ***(1) 黑盒 查找(upload) 扫描 (2) 应用型 窗口 上传中心或者后台中心 上传 Ps:后台是后台 权限是权限 (3) 会员中心 (4) 白盒 基本函数定义 写前端的 Enctype 上传类型Method 提交方式Onsubmit 鼠标的时间Action"放在指定文件"Php 接受表单数据 isset(…...

C++设计模式(更新中)

文章目录 1、创建型模式1.1 简单工厂&#xff08;Simple Factory&#xff09;&#xff08;1&#xff09;示例&#xff08;2&#xff09;总结 1.2 工厂方法&#xff08;Factory Method&#xff09;&#xff08;1&#xff09;示例&#xff08;2&#xff09;总结 1.3 抽象工厂&…...

PHP和Node.js哪个更爽?

先说结论&#xff0c;rust完胜。 php&#xff1a;laravel&#xff0c;swoole&#xff0c;webman&#xff0c;最开始在苏宁的时候写了几年php&#xff0c;当时觉得php真的是世界上最好的语言&#xff0c;因为当初活在舒适圈里&#xff0c;不愿意跳出来&#xff0c;就好比当初活在…...

【CSS position 属性】static、relative、fixed、absolute 、sticky详细介绍,多层嵌套定位示例

文章目录 ★ position 的五种类型及基本用法 ★ 一、position 属性概述 二、position 的五种类型详解(初学者版) 1. static(默认值) 2. relative(相对定位) 3. absolute(绝对定位) 4. fixed(固定定位) 5. sticky(粘性定位) 三、定位元素的层级关系(z-i…...

macOS多出来了:Google云端硬盘、YouTube、表格、幻灯片、Gmail、Google文档等应用

文章目录 问题现象问题原因解决办法 问题现象 macOS启动台&#xff08;Launchpad&#xff09;多出来了&#xff1a;Google云端硬盘、YouTube、表格、幻灯片、Gmail、Google文档等应用。 问题原因 很明显&#xff0c;都是Google家的办公全家桶。这些应用并不是通过独立安装的…...

Nuxt.js 中的路由配置详解

Nuxt.js 通过其内置的路由系统简化了应用的路由配置&#xff0c;使得开发者可以轻松地管理页面导航和 URL 结构。路由配置主要涉及页面组件的组织、动态路由的设置以及路由元信息的配置。 自动路由生成 Nuxt.js 会根据 pages 目录下的文件结构自动生成路由配置。每个文件都会对…...

浅谈不同二分算法的查找情况

二分算法原理比较简单&#xff0c;但是实际的算法模板却有很多&#xff0c;这一切都源于二分查找问题中的复杂情况和二分算法的边界处理&#xff0c;以下是博主对一些二分算法查找的情况分析。 需要说明的是&#xff0c;以下二分算法都是基于有序序列为升序有序的情况&#xf…...

Spring数据访问模块设计

前面我们已经完成了IoC和web模块的设计&#xff0c;聪明的码友立马就知道了&#xff0c;该到数据访问模块了&#xff0c;要不就这俩玩个6啊&#xff0c;查库势在必行&#xff0c;至此&#xff0c;它来了。 一、核心设计理念 1、痛点在哪 应用离不开数据&#xff08;数据库、No…...

AGain DB和倍数增益的关系

我在设置一款索尼CMOS芯片时&#xff0c;Again增益0db变化为6DB&#xff0c;画面的变化只有2倍DN的增益&#xff0c;比如10变为20。 这与dB和线性增益的关系以及传感器处理流程有关。以下是具体原因分析&#xff1a; 1. dB与线性增益的换算关系 6dB对应的理论线性增益应为&…...

无人机侦测与反制技术的进展与应用

国家电网无人机侦测与反制技术的进展与应用 引言 随着无人机&#xff08;无人驾驶飞行器&#xff0c;UAV&#xff09;技术的快速发展&#xff0c;其在商业、娱乐和军事领域的广泛应用带来了新的安全挑战。特别是对于关键基础设施如电力系统&#xff0c;无人机的“黑飞”&…...

深度学习水论文:mamba+图像增强

&#x1f9c0;当前视觉领域对高效长序列建模需求激增&#xff0c;对Mamba图像增强这方向的研究自然也逐渐火热。原因在于其高效长程建模&#xff0c;以及动态计算优势&#xff0c;在图像质量提升和细节恢复方面有难以替代的作用。 &#x1f9c0;因此短时间内&#xff0c;就有不…...

Python+ZeroMQ实战:智能车辆状态监控与模拟模式自动切换

目录 关键点 技术实现1 技术实现2 摘要&#xff1a; 本文将介绍如何利用Python和ZeroMQ消息队列构建一个智能车辆状态监控系统。系统能够根据时间策略自动切换驾驶模式&#xff08;自动驾驶、人工驾驶、远程驾驶、主动安全&#xff09;&#xff0c;并通过实时消息推送更新车…...