C语言 内存函数

目录

前言

一、memcpy()函数

二、memmove()函数

三、memset函数

四、memcmp()函数

总结


前言

在C语言中内存是我们用来存储数据的地址,今天我们来讲一下C语言中常用的内存函数。


一、memcpy()函数

memcpy()函数与我们之前讲的strcpy()函数类似,只不过memcpy()不单单可以用与字符串的复制,可以复制内存中的各种数据类型。函数语法定义:

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

函数 memcpy source 的位置开始向后复制n um 个字节的数据到 destination 指向的内存位置。
这个函数在遇到 '\0' 的时候并不会停下来。
如果source和destination有任何的重叠,复制的结果都是 未定义 的。
#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);//20为复制的字节总大小int i = 0;for (i = 0; i < 10; i++){printf("%d ", arr2[i]);}return 0;
}

虽然memcpy函数也可以实现重叠,但是对于重叠的内存,我们都是交给memmove函数来处理。

函数模拟实现:

void* memcpy(void* dst, const void* src, size_t count)
{void* ret = dst;assert(dst);assert(src);/** copy from lower addresses to higher addresses*/while (count--) {*(char*)dst = *(char*)src;dst = (char*)dst + 1;src = (char*)src + 1;}return(ret);
}

由于不知道输入的数据类型,我们都是一个字节一个字节开始传输的,所以对地址继续强制类型转换为char *。

二、memmove()函数

memmove函数与上面memcpy函数类似,只不过处理的是重叠的内存。函数语法定义:

void * memmove ( void * destination, const void * source, size_t num );
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 ", arr2[i]);}return 0;
}

函数的的模拟实现:
有2种情况:
dest在sourc之后
所以我们需要从后往前复制,比如5->7 4->6 3->5 2->4 1->3,这样交换就不会数据丢失。
dest在source之前:
这时我们就要从前往后复制了,比如3->1,4->2,5->3,6->4,7->5,这样就不会覆盖之前的元素了。
void* memmove(void* dst, const void* src, size_t count)
{void* ret = dst;if (dst <= src || (char*)dst >= ((char*)src + count)) {//从前往后复制while (count--) {*(char*)dst = *(char*)src;dst = (char*)dst + 1;src = (char*)src + 1;}}else {//从后往前复制dst = (char*)dst + count - 1;src = (char*)src + count - 1;while (count--) {*(char*)dst = *(char*)src;dst = (char*)dst - 1;src = (char*)src - 1;}}return(ret);
}

三、memset函数

memset()函数的作用时给设置内存的,将内存中的值以字节为单位设置成想要的内容。

函数语法定义:

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

注意:由于 memset是每个字节每个字节进行设置的,所以对于整型元素的设置,可能达不到我们想要的效果。
#include<stdio.h>int main()
{int a[10] = {0};memset(a,1,10 );int i = 0;for (i = 0; i < 10; i++) {printf("%d ", a[i]);}return 0;
}

输出:

我们想把整型数组元素都设置为1,但是结果却不是我们想要的。因为memset函数是每个字节设置的,在数组中的元素在内存中为:

我们发现memset函数是每个字节都设置为1,所以不是我们想要的。

四、memcmp()函数

memcmp函数比较内存中数据大小,函数语法定义:

int memcmp ( const void * ptr1, const void * ptr2, size_t num );
较从 ptr1 ptr2 指针指向的位置开始,向后的 num 个字节
返回值如下:
函数模拟实现:
int my_memcmp(const void* ptr1, const void* ptr2, size_t num){assert(ptr1&& ptr2);char* p1 = ptr1;char* p2 = ptr2;size_t count = num;while (*p1==*p2){if (num == count) {break;}if (*p1 == '\0');return 0;p1++;p2++;count++;}	return *p1 -*p2;
}

总结

上述文章讲了一些与内存有关的函数,希望对你有所帮助。

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

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

相关文章

Android FrameWork 学习路线

目录 前言 学习路线&#xff1a; 1.基础知识 2、AOSP 源码学习 3. AOSP 源码编译系统 4. Hal与硬件服务 5.基础组件 6. Binder 7. 系统启动过程分析 8. 应用层框架​编辑 9. 显示系统 10. Android 输入系统 11. 系统应用 前言 Android Framework 涉及的行业相当广…

Django 解决新建表删除后无法重新创建等问题

Django 解决新建表删除后无法重新创建等问题 问题发生描述处理办法首先删除了app对应目录migrations下除 __init__.py以外的所有文件:然后&#xff0c;删除migrations中关于你的app的同步数据数据库记录最后&#xff0c;重新执行迁移插入 问题发生描述 Django创建的表&#xf…

HCIP—OSPF课后练习一

本实验模拟了一个企业网络场景&#xff0c;R1、R2、R3为公司总部网络的路由器&#xff0c;R4、R5分别为企业分支机构1和分支机构2的路由器&#xff0c;并且都采用双上行方式与企业总部相连。整个网络都运行OSPF协议&#xff0c;R1、R2、R3之间的链路位于区域0&#xff0c;R4与R…

ubuntu开机启动时,如何随着ubuntu的启动指定qt程序使用普通用户运行?

要在Ubuntu开机启动时指定QT程序使用普通用户运行&#xff0c;您可以通过编辑/etc/xdg/autostart目录下的.desktop文件来实现。以下是详细步骤&#xff1a; 创建启动项&#xff1a;在/etc/xdg/autostart目录下创建一个新的.desktop文件。这个文件将包含启动您的QT程序的命令。…

uniapp 利用uni-list 和 uni-load-more 组件上拉加载列表

列表的加载动作&#xff0c;在移动端开发中随处可见&#xff0c;笔者也是经常用到。今天正好有空&#xff0c;做一个总结&#xff0c;方便以后使用。uniapp 利用uni-list 和 uni-load-more 组件上拉加载列表操作步骤如下&#xff1a;1、资料准备 1&#xff09;、uni-load-more…

JavaWeb--HTML

一&#xff1a;HTML简介 *HTML是一门语言&#xff0c;所有的网页都是用HTML这门语言编写出来的&#xff1b; *HTML&#xff1a;超文本标记语言&#xff1b; 超文本&#xff1a;超越了文本的限制&#xff0c;比普通文本更强大。除了文字信息&#xff0c;还能定义图片&#xff…

Android 设计模式单例

懒加载模式 (使用双重检查锁定)1、双重检查锁定(double checked locking)通常用于延迟初始化单例对象,以提高性能,避免不必要的同步。2、我们首先检查instance是否为null,如果是,我们同步并再次检查instance是否为null,如果仍为null,我们才创建新的实例。 3、这样既能确…

C#对ListBox控件中的数据进行的操作

目录 1.添加数据&#xff1a; 2.删除数据&#xff1a; 3.清空数据&#xff1a; 4.选择项&#xff1a; 5.排序&#xff1a; 6.获取选中的项&#xff1a; 7.获取ListBox中的所有项&#xff1a; 8.综合示例 C#中对ListBox控件中的数据进行的操作主要包括添加、删除、清空、…

zookeeper快速入门二:zookeeper基本概念

本文是zookeeper系列之快速入门中的第二篇&#xff0c;欢迎大家观看与指出不足。 目录 一、zookeeper的存储结构 二、什么是znode 三、znode节点的四种类型 四、权限控制ACL&#xff08;Access Control List&#xff09; 五、事件监听watcher 一、zookeeper的存储结构 z…

Linux之shell条件判断

华子目录 if语句单分支案例 双分支案例 多分支 case多条件判断格式执行过程示例 if语句 单分支 # 语法1&#xff1a; if <条件表达式> then指令 fi#语法2&#xff1a; if <条件表达式>;then指令 fi案例 编写脚本choice1.sh,利用单分支结构实现输入2个整数&#…

Tomcat Session 集群 ---------会话保持

一、 负载均衡、反向代理 环境搭建&#xff1a; nginx服务器192.168.246.7 tomcat 1服务器192.168.246.8 tomcat 2服务器192.168.246.9 7-1 nginx服务器搭建 [rootzzcentos1 ~]#systemctl stop firewalld [rootzzcentos1 ~]#setenforce 0 [rootzzcentos1 ~]#yum install …

springboot“财来财往”微信小程序

摘 要 相比于以前的传统手工管理方式&#xff0c;智能化的管理方式可以大幅降低理财公司的运营人员成本&#xff0c;实现了“财来财往”的标准化、制度化、程序化的管理&#xff0c;有效地防止了“财来财往”的随意管理&#xff0c;提高了信息的处理速度和精确度&#xff0c;能…

HTTP和HTTPS的区别,HTTPS加密原理是?

HTTP和HTTPS都是网络传输协议&#xff0c;主要用于浏览器和服务器之间的数据传输&#xff0c;但它们在数据传输的安全性、加密方式、端口等方面有所不同。 数据传输的安全性&#xff1a;HTTP是明文传输&#xff0c;数据不加密&#xff0c;容易被黑客窃听、篡改或者伪造&#x…

NeRF学习——NeRF-Pytorch的源码解读

学习 github 上 NeRF 的 pytorch 实现项目&#xff08;https://github.com/yenchenlin/nerf-pytorch&#xff09;的一些笔记 1 参数 部分参数配置&#xff1a; 训练参数&#xff1a; 这段代码是在设置一些命令行参数&#xff0c;这些参数用于控制NeRF&#xff08;Neural Radi…

OpenCV 图像重映射函数remap()实例详解

OpenCV 图像重映射函数remap()对图像应用通用几何变换。其原型如下&#xff1a; void remap(InputArray src, OutputArray dst, InputArray map1, InputArray map2, int interpolation&#xff0c; int borderMode BORDER_CONSTANT&#xff0c; const Scalar & borde…

回答自己一年前的一个问题,python如何动态拼接sql

首先谈谈应用场景吧&#xff0c;前提是针对查询接口做接口自动化&#xff0c;接口校验的脚本中&#xff0c;一般以响应报文作为预期值&#xff0c;通过sql查出的数据库值作为实际值&#xff0c;二者对比通过则认为接口输出正确。而sql从何而来呢&#xff0c;对于查询接口一般是…

perl 用 XML::DOM 解析 Freeplane.mm文件,生成测试用例.csv文件

Perl 官网 www.cpan.org 从 https://strawberryperl.com/ 下载网速太慢了 建议从 https://download.csdn.net/download/qq_36286161/87892419 下载 strawberry-perl-5.32.1.1-64bit.zip 约105MB 解压后安装.msi&#xff0c;装完后有520MB&#xff0c;建议安装在D:盘。 运行 …

HarmonyOS NEXT应用开发—组件堆叠

介绍 本示例介绍运用Stack组件以构建多层次堆叠的视觉效果。通过绑定Scroll组件的onScroll滚动事件回调函数&#xff0c;精准捕获滚动动作的发生。当滚动时&#xff0c;实时地调节组件的透明度、高度等属性&#xff0c;从而成功实现了嵌套滚动效果、透明度动态变化以及平滑的组…

【论文阅读】Energy Efficient Real-time Task Scheduling on CPU-GPU Hybrid Clusters

Energy Efficient Real-time Task Scheduling on CPU-GPU Hybrid Clusters 出处&#xff1a;2017IEEE Xplore 基于CPU-GPU混合集群的高效实时任务调度 主要工作&#xff1a;通过动态电压和频率缩放研究了新兴CPU-GPU混合集群的节能问题。 首次分析GPU特定的DVFS模型。 设计了…

Web核心,HTTP,tomcat,Servlet

1&#xff0c;JavaWeb技术栈 B/S架构:Browser/Server&#xff0c;浏览器/服务器架构模式&#xff0c;它的特点是&#xff0c;客户端只需要浏览器&#xff0c;应用程序的逻辑和数据都存储在服务器端。浏览器只需要请求服务器&#xff0c;获取Web资源&#xff0c;服务器把Web资源…