C/C++ string.h库中的memcpy()和memmove()

    不能把一个数组赋给另一个数组,所以要通过循环把数组中的每个元素赋给另一个数组相应的元素。有一个例外的情况是:使用strcpy()和strncpy()函数来处理字符数组。

    memcpy()和memmove()函数提供类似的方法处理任意类型的数组,下面是这两个寒素的原型:
        void *memcpy(void *restrict s1, const void *restrict s2, size_t n);
        void *memmove(void *s1, const void *s2, size_t n);

    这两个函数都从s2指向的位置拷贝n字节到s1指向的位置,而且都返回s1的值。所不同的是memcpy()的参数带关键字restrict,即memcpy()假设两个内存区域之间没有重叠。

    而memmove()不做这样的假设,所以拷贝过程类似于先把所有字节拷贝到一个临时缓冲区,然后再拷贝到最终目的地。

    如果使用memcpy()时,两区域出现重叠会怎样?其行为时未定义的。这意味着该函可能正常工作。也可能失败。编译器不会再本该不使用memcpy()时禁止你使用,作为程序员,再使用该函数时有责任确保两个区域不重叠。

    由于这两个函数设计用于处理任何数据类型,所有它们的参数都是两个指向void的针。

    C允许把任何类型的指针赋给void*类型的指针。如此宽容导致函数无法知道待拷贝据的类型。因此这两个函数使用第3个参数指明待拷贝的字节数。

    需要注意的时,对数组而言,字节数与元素的个数不同。如果要拷贝数组中10个double
类型的元素,要使用10*sizeof(double),而不是10.

示例源码:

// Len_memcpy.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//#include <iostream>
#define SIZE 10
#include <string>
using namespace std;void PrintD(string s, int* data, int len)
{	printf("%s\t", s.c_str());for (int i = 0; i < len; i++){printf("%d\t", data[i]);}printf("\n");
}
void PrintD(string s, double* data, int len)
{printf("%s\t", s.c_str());for (int i = 0; i < len; i++){printf("%.2lf\t", data[i]);}printf("\n");
}
int main()
{int nValues[SIZE] = { 1,2,3,4,5,6,7,8,9,10 };double dValues[SIZE] = { 1.1, 2.2, 3.3, 4.4, 5.5,6.6,7.7,8.8,9.9, 0.1 };int memcpyN[SIZE] = {0};          // 使用memcpy拷贝数据到这里double memcpyD[SIZE] = {0.0};int memmoveN[SIZE] = { 0 };		 // 使用memmove拷贝数据到这里double memmoveD[SIZE] = { 0.0 };printf(" copy before: \n");PrintD("Values  ", nValues, SIZE);PrintD("dValues ", dValues, SIZE);PrintD("targetN ", memcpyN, SIZE);PrintD("targetD ", memcpyD, SIZE);printf("\n after memcpy copy: \n");memcpy(memcpyN, nValues, sizeof(int)*SIZE);memcpy(memcpyD, dValues, sizeof(int)*SIZE); // double比size占位宽,这里会丢失数据PrintD("Values  ", nValues, SIZE);PrintD("dValues ", dValues, SIZE);PrintD("memcpyN ", memcpyN, SIZE);PrintD("memcpyD ", memcpyD, SIZE);printf("\n after memmove copy: \n");memcpy(memmoveN, nValues, sizeof(int)*SIZE);memcpy(memmoveD, dValues, sizeof(double)*SIZE); // 这里不会再丢失数据PrintD("Values  ", nValues, SIZE);PrintD("dValues ", dValues, SIZE);PrintD("memmoveN", memmoveN, SIZE);PrintD("memmoveD", memmoveD, SIZE);
}

执行结果:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/290302.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

CVE-2023-46604 Apache ActiveMQ RCE漏洞

一、Apache ActiveMQ简介 Apache ActiveMQ是一个开源的、功能强大的消息代理&#xff08;Message Broker&#xff09;&#xff0c;由 Apache Software Foundation 所提供。ActiveMQ 支持 Java Message Service&#xff08;JMS&#xff09;1.1 和 2.0规范&#xff0c;提供了一个…

最新版Eclipse下载及安装(详细)

Eclipse是JavaWeb开发最常用的工具&#xff0c;下面详细介绍一下如何下载安装最新版Eclipse。 一、Eclipse下载 1.输入网址&#xff1a;https://www.eclipse.org/downloads/ 我们会到官网中找到如下的下载按钮&#xff0c;但默认下载的是Windows操作系统的64位&#xff0c;我…

递归算法:二叉树前序、中序、后序遍历解析与递归思想深度剖析

&#x1f3ac; 鸽芷咕&#xff1a;个人主页 &#x1f525; 个人专栏: 《linux深造日志》 《高效算法》 ⛺️生活的理想&#xff0c;就是为了理想的生活! 文章目录 一、二叉树的遍历1.1 链式结构二叉树的创建1.1 二叉树结构图 二、 前序遍历代码演示&#xff1a;2.1 前序遍历递…

存在重复元素

题目链接 存在重复元素 题目描述 注意点 无 解答思路 根据Set无法存储相同元素的特点判断nums中是否存在重复元素 代码 class Solution {public boolean containsDuplicate(int[] nums) {Set<Integer> set new HashSet<Integer>();for (int x : nums) {if …

leetcode 974. 和可被 K 整除的子数组(优质解法)

代码&#xff1a; class Solution {public int subarraysDivByK(int[] nums, int k) {HashMap<Integer,Integer> hashMapnew HashMap();hashMap.put(0,1);int count0; //记录子数组的个数int last0; //前一个下标的前缀和int now0; //当前下标的前缀和for(int i0;…

OSPF面试总结

OSPF 基本特点 属于IGP、LS支持无类域间路由没有环路&#xff08;区域内运行LS、区域间是DV,所以所有的区域要和区域0相连&#xff09;收敛速度快使用组播发送数据 224.0.0.5、224.0.0.6 什么时候用224.0.0.5&#xff1f;支持多条等价路由支持协议报文认证 OSPF路由的计算过程…

Leetcode—179.最大数【中等】

2023每日刷题&#xff08;六十五&#xff09; Leetcode—179.最大数 算法思想 实现代码 其中sort的lambda自定义排序策略参考自官方文档 class Solution { public:string largestNumber(vector<int>& nums) {string ans;vector<string> strs;for(auto num: …

Prompt-to-Prompt:基于 cross-attention 控制的图像编辑技术

Hertz A, Mokady R, Tenenbaum J, et al. Prompt-to-prompt image editing with cross attention control[J]. arXiv preprint arXiv:2208.01626, 2022. Prompt-to-Prompt 是 Google 提出的一种全新的图像编辑方法&#xff0c;不同于任何传统方法需要用户指定编辑区域&#xff…

神经网络学习小记录76——Tensorflow2设置随机种子Seed来保证训练结果唯一

神经网络学习小记录76——Tensorflow2设置随机种子Seed来保证训练结果唯一 学习前言为什么每次训练结果不同什么是随机种子训练中设置随机种子 学习前言 好多同学每次训练结果不同&#xff0c;最大的指标可能会差到3-4%这样&#xff0c;这是因为随机种子没有设定导致的&#x…

在.NET 应用程序中使用DSN-GBASE南大通用

在.NET 应用程序中使用GBASE南大通用 machine.config 文件中的资源时&#xff0c;首先需在工程中 引用 .NET Framework 的组件GBASE南大通用 System.configuration&#xff0c;然后使用 using 语句将GBASE南大通用System.configuration 命名空间中的类引入到工程中。 1) 在工…

Python-基于fastapi实现SSE流式返回(类似GPT)

最近在做大模型对话相关功能&#xff0c;需要将对话内容流式返回给前端页面&#xff08;类似GPT的效果&#xff09;。下面直接说下如何实现&#xff1a; 1.首先导入fastapi和sse流式返回所需要的包 from fastapi import APIRouter, Response, status from sse_starlette.sse …

Ubuntu 常用命令之 gzip 命令用法介绍

&#x1f4d1;Linux/Ubuntu 常用命令归类整理 gzip 是一个在 Linux 和 Unix 系统中常用的文件压缩工具。它的名字来源于 GNU zip&#xff0c;作为一个自由软件&#xff0c;它是 GNU 项目的一部分。gzip 命令通常用于压缩文件&#xff0c;以节省磁盘空间&#xff0c;或者减小文…