【c语言】探索内存函数

探索内存函数

  • memcpy函数
  • memmove函数
  • memset函数
  • memcmp函数:

memcpy函数

memcpy函数声明:

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

将source空间下的num个字符复制到dest中去

函数的使用
将字符数组a的5字节的字符复制到a1中去

#include<stdio.h>
#include<string.h>
int main()
{char a[] = {"abcde"};char a1[20] = {0};memcpy(a1,a,5);printf("%s",a1);return 0;
}//最后输出abcde

memcpy函数模拟实现:

void* my_memcpy(void*dest,const void*src,size_t num)
{char* ret = (char*)dest;while (num){*(char*)dest = *(char*)src;dest = (char*)dest + 1;src = (char*)src + 1;num--;}return ret;
}int main()
{int a[] = {1,2,3,4,5,6,7,8,9,10};int a1[10] = {0};my_memcpy(a1,a+3,20);for (int i=0;i<10;i++){printf("%d ",a1[i]);}return 0;
}

memmove函数

函数的声明:

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

memmove函数使用:

int main()
{int a[] = {1,2,3,4,5,6,7,8,9,10};memmove(a,a+3,20);for (int i=0;i<10;i++){printf("%d ",a[i]);}return 0;
}

函数的模拟实现

void* my_mommove(void*dest,const void*src,size_t num)
{assert(dest&&src);void* ret = dest;if (dest < src)//判断dest与src的位置关系{while (num){*(char*)dest = *(char*)src;dest = (char*)dest + 1;src = (char*)src + 1;num--;}}else{src = (char*)src + num - 1;dest = (char*)dest+num - 1;while (num--){*(char*)dest = *(char*)src;dest = (char*)dest - 1;src = (char*)src - 1;}}return ret;
}int main()
{int a[] = {1,2,3,4,5,6,7,8,9,10};my_mommove(a+3,a,20);for (int i=0;i<10;i++){printf("%d ",a[i]);}return 0;
}

memcpy函数与memmove函数的区别:
memcpy函数在复制重叠的内存空间时,最后的结果是未知的,所以当源空间与目标空间重叠时,不用memcpy
memmove函数可以正确的复制重叠空间

在模拟memmove函数时,需要注意:

  • dest指针大于还是小于src指针
  • 如果是大于,在复制时从前往
  • 如果是小于,在复制时从后往前

memset函数

函数的声明:

void * memset ( void * ptr, int value, size_t num );

memset 函数是将ptr指针指向的空间下num个字节的值赋值为value

函数的使用

int main()
{char a[] = {"hello world"};memset(a,'x',6);printf("%s",a);return 0;
}//前6个字符变成x

memcmp函数:

函数声明

int memcmp ( const void * ptr1, const void * ptr2, size_t num );

比较两个指针指向的空间下num个字节的大小

  • 若ptr1大于ptr2,返回大于0的数

  • 小于返回小于0的数

  • 等于返回0

memcmp函数的使用:

int main()
{int a[] = {1,2,3,4,5};int a1[] = {1,2,3,4,6};printf("%d", memcmp(a, a1, 20));return 0;
}

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

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

相关文章

用java实现客服聊天+网络爬虫下载音乐(java网络编程,io,多线程)

一 灵感&#xff1a; 在2022年的暑假&#xff0c;也就是我即将迈进高三的那个暑假&#xff0c;我并没有察觉自己应该要学习了&#xff0c;还是和过往的暑假一样玩着王者荣耀&#xff0c;凌晨2点睡觉&#xff0c;中午12点起床。我依稀记得这种状态一直持续到8月19。然而离开学还…

【MySQL】Linux安装MySQL

一、center OS环境准备 为了在Linux系统中查看MySQL5.8与8.0版本的区别 我们要准备两个虚拟机&#xff0c;需要的软件&#xff1a;VMware和CentOS7 因为博主之前在学习redis的时候已经安装过一个虚拟机了&#xff0c;所以我就直接克隆了一个CentOS2.0 修改mac地址&#xff0…

STM32作业实现(二)串口控制led

目录 STM32作业设计 STM32作业实现(一)串口通信 STM32作业实现(二)串口控制led STM32作业实现(三)串口控制有源蜂鸣器 STM32作业实现(四)光敏传感器 STM32作业实现(五)温湿度传感器dht11 STM32作业实现(六)闪存保存数据 STM32作业实现(七)OLED显示数据 STM32作业实现(八)触摸按…

用python画一艘“福建舰”

import turtle # 设置画布和画笔 screen turtle.Screen() screen.bgcolor("white") pen turtle.Turtle() pen.speed(10) pen.color("blue") pen.penup() # 航母主体&#xff08;简化为一个矩形&#xff09; pen.goto(-200, 0) pen.pen…

路由和交换网络技术有哪些内容?

1. 路由器和交换机的基本概念&#xff1a;了解路由器和交换机的定义、功能和区别&#xff0c;以及它们在网络中的重要作用。 2. 路由协议&#xff1a;掌握常见的路由协议&#xff0c;如静态路由、动态路由和默认路由&#xff0c;以及它们的工作原理和使用场景。 3. VLAN和IP地址…

深入理解Java中的List集合:解析实例、优化技巧与最佳实践

一&#xff1a;List 集合的基础 1.1 什么是 List 集合&#xff1f; List 集合是 Java 集合框架中的一种有序、可重复的数据结构&#xff0c;它继承自Collection 接口&#xff0c;允许存储多个元素。 与数组不同&#xff0c;List 集合的大小是动态可变的&#xff0c;可以根据…

通过指针变量访问整型变量

有两个与指针变量有关的运算符&#xff1a; (1)&&#xff1a;取地址运算符。 (2)*&#xff1a;指针运算符&#xff08;或称间接访问运算符&#xff09;。 例如&#xff1a;&a为变量a的地址&#xff0c;*p为指针变量p所指向的存储单元。 编写程序&#xff1a; 运行结果…

【面试经典150题】移除元素

目录 一.移除元素 一.移除元素 这题的思路非常清晰&#xff0c;可以使用迭代器遍历找到需要删除的元素使用erase删除即可&#xff1a; #include<iostream> #include<vector>using namespace std;class Solution { public:int removeElement(vector<int>&…

设计模式(六)结构型模式---桥接模式

文章目录 桥接模式简介结构优点UML图具体实现UML图代码实现 桥接模式简介 桥接模式是一种将抽象与实现分离&#xff0c;使它们独立变化。然后利用组合关系来代替继承关系&#xff0c;大大的降低了抽象和实现的耦合度的设计模式。实际使用&#xff1a; JDBC源码分析&#xff0c…

C语言习题~day26

1.以下关于枚举的说法&#xff0c;哪个是正确的&#xff1f; A.枚举类型可以具有浮点数作为枚举值。 B.枚举类型在内存中存储为整数。 C.枚举类型可以包含字符串作为枚举值。 D.枚举类型不能作为函数的参数传递。 B 2.下面代码的结果是&#xff1a;&#xff08; &#xff0…

Kotlin 继承和实现

文章目录 前言继承&#xff08;extend&#xff09;实现&#xff08;implement&#xff09;继承与实现 前言 在 Kotlin 中&#xff0c;继承和实现都是在类名后使用冒号:&#xff0c;后边加上其他类或接口的名称来表示&#xff0c;二者之间写法没有太大区别&#xff08;类需要加…

Xcode下载安装

1.Xcode可用版本判断&#xff1a; 2.Xcode下载安装&#xff1a; 方案1:AppStore 下载更新 若方案1失败则 方案2:指定版本Xcode包下载解压安装 苹果下载 3.Xcode命令行工具插件安装 xcode-select --install 备注&#xff1a; xcode_x.x.x.xip(压缩包存在时效性(使用前24h/…

Mac专用投屏工具:AirServer 7 for Mac 激活版下载

AirServer 7 是一款在 Windows 和 macOS 平台上运行的强大的屏幕镜像和屏幕录制软件。它能够将 iOS 设备、Mac 以及其他 AirPlay、Google Cast 和 Miracast 兼容设备的屏幕镜像到电脑上&#xff0c;并支持高质量的录制功能。总的来说&#xff0c;AirServer 7 是一款功能全面的屏…

Mybatis编写SQL

文章目录 一、用注解编写1.1 增普通增加获取自增ID 1.2 删和改1.3 查单表查询多表查询 二、用xml编写2.1 使用xml的流程2.2 增普通增加获取自增ID 2.3 删 和 改2.4 查 三、#{} 和 ${}3.1 #{} 、${}3.1 预编译 SQL 、即时编译SQL 两种写法是可以同时存在的 一、用注解编写 1.1 …

QuillEditor+vue3 本身不支持行高的配置,那么如何配置行高?

通过查阅官方文档和众多资料发现&#xff0c;在QuillEditor的使用中&#xff0c;行高的配置并不像加粗、斜体等样式仅需配置关键词即可&#xff0c;那么QuillEditor的行高如何配置呢&#xff1f; 首先我们仍然要在富文本的配置的modules中写入行高的配置项 const myOptions …

linux bind函数

bind函数的目的是让把客户端对应的端口(port)地址和ip地址绑定到客户端 [参考](Linux之bind 函数&#xff08;详细篇&#xff09;_linux bind函数-CSDN博客)

Text1作业

Text1作业 Text1作业 题量: 16 满分: 100.0 一. 单选题&#xff08;共5题&#xff09; 1【单选题】A______ is a functional unit that interprets and carries out instructions.&#xff08;5.0分&#xff09; A memoryB processorC storageD network 2【单选题】A____…

mediasoup基础概览

提示&#xff1a;本文为之前mediasoup基础介绍的优化 mediasoup基础概览 架构&#xff1a;2.特性&#xff1a;优点缺点 3.mediasoup常见类介绍js部分c 4.mediasoup类图5.业务类图 Mediasoup 是一个构建在现代 Web 技术之上的实时通信&#xff08;RTC&#xff09;解决方案&#…

c语言多进程编程实例:深度探索与实用技巧

c语言多进程编程实例&#xff1a;深度探索与实用技巧 在C语言编程中&#xff0c;多进程编程是实现并发执行和资源共享的重要手段。本文将通过四个关键方面、五个核心要点、六个进阶技巧以及七个实践建议&#xff0c;带领读者深入理解C语言多进程编程的精髓。 四个方面&#x…

快速排序详讲(两种方法)

目录 原理 实现方式 正常实现 理由 先从右到左&#xff0c;在从左到右 先从左到右&#xff0c;先从右到左 挖坑法 效率 优化 测试 代码 原理 快速排序是将最左侧的数字当作关键数字&#xff0c;将关键数字放在对应位置&#xff0c;且关键数字左侧均大于它&#xff…