C语言内存操作函数

目录

一. C语言内存操作函数

1. memcpy的使用和模拟实现

2. memmove函数

3. memset函数

4. memcmp函数


一. C语言内存操作函数

随着知识的不断积累,我们所想要实现的目标程序就会更加复杂,今天我们来学习一个新的知识叫做C语言内存操作函数,它是C语言标准库中提供的一系列对内存进行操作的函数。比如对于内存的复制,内存的设置以及内存的比较,这些函数都是针对内存块来处理的,为程序员提供了更加安全,高效和灵活的方式,让程序员能够对内存进行各种常见的操作和处理,下面就让我们来详细了解一下吧。😁🤗🤗

1. memcpy的使用和模拟实现

首先我们来认识memcpy函数,它的原型是void* memcpy(void* destination, const void* soure,size_t num),作用就是内容的复制,从soure的位置开始向后复制num个字节(注意单位是字节)的数据到destination指向的内存位置这个函数遇到'/0'的时候并不会停下来并且destination和soure有任何的重叠,复制的结果都是未定义的。下面给出大家实际的例子:

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

 对于运行结果来说我们也可以看出来如果num小于实际输出的数量,那么后面都是用0来补的,大家下去可以自己多尝试进行练习。

🎡🎡如何模拟实现memecpy函数呢?

#include <assert.h>
void* my_memcpy(void* str1, const void* str2, size_t num)
{void* ret = str1;assert(str1);assert(str2);/** copy from lower addresses to higher addresses*/while (num--) {*(char*)str1 = *(char*)str2;str1 = (char*)str1 + 1;str2 = (char*)str2 + 1;}return(ret);
}
int main()
{int arr1[10] = { 1,2,3,4,5,6,7,8,9,10 };int arr2[10] = { 0 };my_memcpy(arr2, arr1, 40);int i = 0;for (i = 0; i < 10; i++){printf("%d ", arr2[i]);}return 0;
}

在我们模拟实现的过程中,在开始的时候我们要注意两个指针不能是空指针,需要assert进行断言,我们为什么要进行强制类型转换成char*呢?首先我们要明确memcpy函数传入第三个参数size_t num是字节的个数,所以当我们强制类型转换的时候会更加方便去计算,另外就是我们的指针是void*类型的,是不能直接进行加减运算的,最终返回一个void*的指针。

2. memmove函数

接下来认识memmove函数,它的原型是void* memmove(void* destination,const void* scoure,size_t num),原型与memcpy函数是一模一样的,所以说其实memmove函数与memcpy函数的区别就是memmove函数可以处理重叠部分。也就是说如果源空间也目标空间出现重叠的话,我们就使用memmove函数来处理。给大家举一个例子说明:

#include <stdio.h>
#include <string.h>
int main()
{int arr1[] = { 1,2,3,4,5,6,7,8,9,10 };memmove(arr1 + 2, arr1, 20);int i = 0;for (i = 0; i < 10; i++){printf("%d ", arr1[i]);}return 0;
}

 其实对于我们memmove函数的实现其实是更复杂的,那么我们究竟要如何实现它呢?大家看下面面的四种情况:

sour代表的是源空间,des代表的是目标函数,大家认真看第一个,如果我们将sour里面的内容复制到des中,我们可以直接按顺序将34567依次放入12345中,最终我们的打印结果就是3 4 5 6 7 6 7 8 9 10,但是我们来看第三种,如果我们将34567按顺序放在56789中,我们会发现当我们放完3和4之后,原本的5和6就会变成3和4,那么原来应该把5和6放在7和8位置上的计划就不能实现,所以这样放是不对的,但我们换一种方法,我们先将7放入9,再将6放入8,也就是从后面往前面放置,对于第四种来说,从前往后和从后往前都是一样的。所以我给出大家一张图来更好的说明:我们的数组有高低地址之分,也就是说当我们的des小于sour的时候我们选择从前往后,除此之外我们选择从前往后,所以了解了底层的逻辑下面我们就开始设计我们的代码: 

#include <stdio.h>
#include <string.h>
#include <assert.h>
void* my_memmove(void* dest, const void* sour, size_t num)
{assert(dest && sour);void* ret = dest;if (dest < sour)//从前往后{while (num--){*(char*)dest = *(char*)sour;dest = (char*)dest + 1;sour = (char*)sour + 1;}}else//从后往前{while (num--){*((char*)dest + num) = *((char*)sour + num);}}return ret;};int main()
{int arr1[] = { 1,2,3,4,5,6,7,8,9,10 };my_memmove(arr1 + 2, arr1, 20);int i = 0;for (i = 0; i < 10; i++){printf("%d ", arr1[i]);}return 0;
}

但是可能细心的同学会发现,我们就算使用memcpy函数也能够实现重叠部分的程序运算,但是我们在C语言中更推荐规范使用,如果有重叠部分的就使用memmove函数,虽然我们在VS的编译器上用memcpy来处理重叠部分可以成功,但是在其他编译器上却不一定,所以我们尽量的规范使用。

3. memset函数

🧣🧣memset函数是用来设置内存的,将内存中的值以字节为单位设置成想要的内容。它的原型是void* memset(void* ptr,int value,size_t num);ptr就指向要被填充的内存块指针,value要设置的内容,num就表示要设置成多少个字节。

#include <stdio.h>
#include <string.h>
int main ()
{char str[] = "hello world";memset (str,'x',6);printf(str);return 0;

 

4. memcmp函数

🧀🧀memcmp函数是用来比较两个指针大小的,它的原型是int memcmp(const void* ptr1,const void* ptr2,size_t num),就是对内存块ptr1和ptr2进行比较,比较从ptr1和ptr2指针指向的位置开始,向后的num个字节,注意也是以字节为单位,当ptr1>ptr2的时候,返回大于0的值,当两个相等的时候,返回0,当ptr1<ptr2的时候,返回小于0的值

#include <stdio.h>
#include <string.h>
int main()
{char buffer1[] = "DWgaOtP12df0";char buffer2[] = "DWGAOTP12DF0";int n;n = memcmp(buffer1, buffer2, sizeof(buffer1));if (n > 0) printf("'%s' is greater than '%s'.\n", buffer1, buffer2);else if (n < 0) printf("'%s' is less than '%s'.\n", buffer1, buffer2);elseprintf("'%s' is the same as '%s'.\n", buffer1, buffer2);return 0;

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

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

相关文章

基于Python的火车票售票系统/基于django的火车购票系统

摘 要 随着信息技术和网络技术的飞速发展&#xff0c;人类已进入全新信息化时代&#xff0c;传统管理技术已无法高效&#xff0c;便捷地管理信息。为了迎合时代需求&#xff0c;优化管理效率&#xff0c;各种各样的管理系统应运而生&#xff0c;各行各业相继进入信息管理时代&…

面试经典算法150题系列-最长公共前缀

最长公共前缀 编写一个函数来查找字符串数组中的最长公共前缀。 如果不存在公共前缀&#xff0c;返回空字符串 ""。 示例 1&#xff1a; 输入&#xff1a;strs ["flower","flow","flight"] 输出&#xff1a;"fl"示例 2&…

HTML及CSS面试题4

1、BFC 1.1、介绍BFC及其应用 补充——触发BFC的方式&#xff0c;常见的有&#xff1a; 设置浮动overflow设置为&#xff1a;auto、scroll、hiddenpositon设置为&#xff1a;absolute、fixed 介绍&#xff1a; ○ 所谓BFC&#xff0c;指的是&#xff1a;一个独立的布局环境&am…

集合的知识点

一、集合的简介 1.1 什么是集合 集合(Collection)&#xff0c;也是一个数据容器&#xff0c;类似于数组&#xff0c;但是和数组是不一样的。集合是一个可变的容器&#xff0c;可以随时向集合集合中添加元素&#xff0c;也可以随时从集合中删除元素。另外&#xff0c;集合还提…

鸿蒙(API 12 Beta3版)【录像流二次处理(C/C++)】媒体相机开发指导

通过ImageReceiver创建录像输出&#xff0c;获取录像流实时数据&#xff0c;以供后续进行图像二次处理&#xff0c;比如应用可以对其添加滤镜算法等。 开发步骤 导入NDK接口&#xff0c;接口中提供了相机相关的属性和方法&#xff0c;导入方法如下。 // 导入NDK接口头文件#in…

使用python实现3D聚类图

实验记录&#xff0c;在做XX得分预测的实验中&#xff0c;做了一个基于Python的3D聚类图&#xff0c;水平有限&#xff0c;仅供参考。 一、以实现三个类别聚类为例 代码&#xff1a; import pandas as pd import numpy as np from sklearn.decomposition import PCA from sk…

开源版最新LoveCardsV2表白墙源码下载

源码亮点 模板系统&#xff0c;给你无限可能 卡片不限字数&#xff0c;支持多图片上传 支持评论&#xff0c;点赞&#xff0c;让互动性拉满 管理后台可添加多个管理员 卡片一键分享至多平台 卡片浏览次数统计 发行版开箱即用 部署教程 1. 环境&#xff08;参考开发环境&…

XSS- DOMclobbering与svg深度利用

目录 源码展示 解法一&#xff1a;绕过过滤-DOM clobbering 什么是DOM clobbering DOM clobbering原理 全局变量自动创建 属性名冲突 影响脚本执行 逐过程分析 源码展示 <script>const data decodeURIComponent(location.hash.substr(1));;const root documen…

图像处理之:Video Processing Subsystem(三)

免责声明&#xff1a; 本文所提供的信息和内容仅供参考。作者对本文内容的准确性、完整性、及时性或适用性不作任何明示或暗示的保证。在任何情况下&#xff0c;作者不对因使用本文内容而导致的任何直接或间接损失承担责任&#xff0c;包括但不限于数据丢失、业务中断或其他经济…

【硬件模块】震动传感器模块

震动传感器模块实物图 DO&#xff1a;数字信号量输出&#xff0c;接单片机管脚&#xff1b; AO&#xff1a;模拟输出&#xff0c;无效&#xff0c;一般不接。 无震动&#xff0c;DO输出高电平&#xff0c;信号指示灯灭&#xff1b; 有震动&#xff0c;DO输出低电平&#xff0c;…

DHCP的原理与配置

目录 DHCP的原理 DHCP是什么 DHCP的好处 DHCP的分配方式 DHCP的工作原理 DHCP的配置 环境设置 DHCP配置 验证配置是否成功 DHCP的原理 DHCP是什么 DHCP:Dynamic Host Configuration Protocol&#xff0c;动态主机配置协议。由Internet工作小组开发&#xff0c;专门用…

牛客网习题——通过C++实现

一、目标 实现下面4道练习题增强C代码能力。 1.求123...n_牛客题霸_牛客网 (nowcoder.com) 2.计算日期到天数转换_牛客题霸_牛客网 (nowcoder.com) 3.日期差值_牛客题霸_牛客网 (nowcoder.com) 4.打印日期_牛客题霸_牛客网 (nowcoder.com) 二、对目标的实现 1.求123...n_…

【unity小技巧】下载原神模型,在Blender中PMX模型转FBX模型,导入到Unity中实现基于光照模型的内置和URP卡通渲染

最终效果 前言 最近在研究人物模型的使用和卡通渲染效果&#xff0c;这里我们就使用原神的模型来演示。 一、原神模型下载 原神的模型可以在官网直接下载到。 1、第一期模型 官网&#xff1a;https://ys.biligame.com/gczj/ 2、第二期模型 官网&#xff1a;http://ys.bi…

Axure高端交互元件库:助力产品与设计

用户体验&#xff08;UX&#xff09;和用户界面&#xff08;UI&#xff09;设计对于任何产品的成功都至关重要。为了在这个竞争激烈的市场中脱颖而出&#xff0c;设计师和产品开发团队需要依赖强大的工具来创造引人注目且功能丰富的交互界面。下面介绍一款Axure精心制作的"…

背包问题的模板及各个等价变形

目录 0-1背包 —— 二维二重循环 01背包 —— 一维二重循环 完全背包 —— 二维三重循环 完全背包 —— 二维二重循环 完全背包 —— 一维二重循环 0-1背包 —— 二维二重循环 #include <bits/stdc.h> using namespace std; const int N 1010; int dp[N][N]; int v…

鸿蒙内核源码分析——(自旋锁篇)

本篇说清楚自旋锁 读本篇之前建议先读系列篇 进程/线程篇. 内核中哪些地方会用到自旋锁?看图: 概述 自旋锁顾名思义&#xff0c;是一把自动旋转的锁&#xff0c;这很像厕所里的锁&#xff0c;进入前标记是绿色可用的&#xff0c;进入格子间后&#xff0c;手一带&#xff0c…

Github 2024-08-19 开源项目周报Top15

根据Github Trendings的统计,本周(2024-08-19统计)共有15个项目上榜。根据开发语言中项目的数量,汇总情况如下: 开发语言项目数量Python项目7JavaScript项目3TypeScript项目3Dart项目2HTML项目1PowerShell项目1Clojure项目1C++项目1Rust项目1Bootstrap 5: Web上开发响应式、…

嵌入式软件--模电基础 DAY 2

强电和弱电&#xff0c;简单一点是以电死人为标准的&#xff0c;交流电36伏特以下&#xff0c;直流电24V以下&#xff0c;为安全电压&#xff0c;是为弱电&#xff0c;反则强电。 市电进入家庭&#xff0c;连接你的电脑&#xff0c;220V的电压为什么没有让你感到危险&#xff…

YOLO知识点总结:

分类&#xff1a; 即是将图像结构化为某一类别的信息&#xff0c;用事先确定好的类别(category)或实例ID来描述图片。这一任务是最简单、最基础的图像理解任务&#xff0c;也是深度学习模型最先取得突破和实现大规模应用的任务。其中&#xff0c;ImageNet是最权威的评测集&…

【区块链+金融服务】基于区块链的一站式绿色金融开放平台 | FISCO BCOS应用案例

科技的进步为绿色金融发展提供了新的机遇&#xff0c;但银行、企业、第三方金融机构等在进行绿色金融业务操作过程中&#xff0c; 存在着相关系统和服务平台建设成本高、迭代难度大、数据交互弱、适配难等痛点。 基于此&#xff0c;中碳绿信采用国产开源联盟链底层平台 FISCO …