【C语言】明析部分C语言内存函数
目录
1.memcpy
2.memmove
3.memset
4.memcmp
以下都是内存函数,作用单位均是字节
1.memcpy
memcpy是C/C++语言中的一个内存拷贝函数,其原型为:
void* memcpy(void* dest, const void* src, size_t n);目标空间(字节) 源空间(字节) 拷贝个数
该函数的功能是将源地址src开始的n个字节内容复制到目标地址dest开始的内存空间。
使用memcpy函数需要注意以下几点:
- 要确保目标地址dest有足够的空间来存放从源地址src复制过来的数据,否则可能会发生内存溢出。
- 要确保源地址src和目标地址dest指向的内存内容是可读写的。
- 在使用该函数时需要注意边界情况,即源地址src和目标地址dest的有效数据范围。
接下来,我们观察memcpy函数:
#include <stdio.h>
#include <string.h>int main() {const char* src = "Hello, memcpy!";char dest[20];// 复制字符串到dest中memcpy(dest, src, strlen(src) + 1);// 输出复制后的字符串printf("Copied string: %s\n", dest);return 0;
}
程序运行结果:
Copied string: Hello, memcpy!
很显然,源字符串“Hello, memcpy!”已成功被复制到了目标字符数组dest
中。
现在,我们来观察memcpy函数的实现方式:
//Memcpy
#include<stdio.h>
#include<assert.h>void* Memcpy(void* dest, const void* src, size_t byte_num) {assert(dest && src);char* ptr_1 = (char*)dest;const char* ptr_2 = (const char*)src;while (byte_num) {*ptr_1 = *ptr_2;ptr_1++;ptr_2++;byte_num--;}return dest;//返回指向目标内存块的指针。
}int main() {int arr[] = { 1,2,3,4,5,6,7,8,9,0 };int src[] = { 8,8,8,8,8,8,8,8,8,8 };Memcpy(arr, src, 15);for (int i = 0; i < sizeof(arr) / sizeof(arr[0]); i++) {printf("%d ", arr[i]);}return 0;
}
2.memmove
memmove函数与memcpy函数功能相似,但是memmove函数会考虑源地址和目标地址重叠的情况,它会根据具体情况采取不同的拷贝方式,避免数据错误或内存访问冲突。
接下来,我们观察memmove函数:
#include <stdio.h>
#include <string.h>int main() {char str[50] = "Hello, memmove!";char buffer[20];// 复制数据到buffer,源和目标地址重叠memmove(str + 7, str, strlen(str) + 1); // 输出复制后的字符串printf("Copied string: %s\n", str);return 0;
}
很容易发现,memmove函数可以作用于同一个函数
我们再看看该函数的模拟实现:
void* my_memmove(void* dest, const void* src, size_t n) {char* d = (char*)dest;const char* s = (const char*)src;// 判断源地址和目标地址是否有重叠if (d < s) {for (size_t i = 0; i < n; i++) {d[i] = s[i];}} else if (d > s) {for (size_t i = n; i > 0; i--) {d[i - 1] = s[i - 1];}}return dest;
}
my_memmove
函数和标准的memmove
函数功能类似,可以处理源地址和目标地址重叠的情况。如果源地址在目标地址之前,就从源地址前往后复制数据;如果源地址在目标地址之后,就从源地址后往前复制数据。
3.memset
memset函数是C标准库中的一个函数,用于将一块内存空间的内容全部设置为指定的值。
接下来,我们观察memset函数:
#include <stdio.h>
#include <string.h>int main() {char str[50];// 初始化str数组为0memset(str, 0, sizeof(str));// 打印初始化后的字符串printf("Initialized string: %s\n", str);return 0;
}
Initialized string:
在这个例子中,我们先定义了一个字符数组
str
,然后使用memset
函数将str
数组内的内存空间全部设置为0。最后打印出初始化后的字符串内容,因为全部设置为0,所以输出结果为"Initialized string: "。
memset
函数通常用于在初始化数据结构或清空内存块时设置初始值,例如清空一个数组、结构体或其他内存区域的内容。
我们再看看该函数的模拟实现:
void* my_memset(void* ptr, int value, size_t num) {unsigned char* p = (unsigned char*)ptr;for (size_t i = 0; i < num; i++) {p[i] = (unsigned char)value;}return ptr;
}
这个模拟实现的
my_memset
函数功能类似于标准的memset
函数,通过将内存空间中的每个字节设置为指定的值来实现初始化。传入的参数包括要初始化的内存位置的指针ptr
,要设置的值value
,以及要初始化的字节数num
。循环遍历内存空间,将每个字节设置为指定的值。最后返回指向初始化后的内存空间的指针。
4.memcmp
memcmp
是C标准库中的一个函数,用于比较两块内存区域的内容。
接下来,我们观察memset函数:
#include <stdio.h>
#include <string.h>int main() {char str1[] = "Hello";char str2[] = "World";int result = memcmp(str1, str2, 5);if (result == 0) {printf("str1 and str2 are equal.\n");} else if (result < 0) {printf("str1 is less than str2.\n");} else {printf("str1 is greater than str2.\n");}return 0;
}
str1 is less than str2.
这是因为在ASCII编码中,字符'H'的ASCII码小于字符'W'的ASCII码。因此,
str1
在内存中的前5个字符的比较结果是str1
小于str2
。
Over……希望对你有帮助,fight together!
相关文章:

【C语言】明析部分C语言内存函数
目录 1.memcpy 2.memmove 3.memset 4.memcmp 以下都是内存函数,作用单位均是字节 1.memcpy memcpy是C/C语言中的一个内存拷贝函数,其原型为: void* memcpy(void* dest, const void* src, size_t n);目标空间(字节)…...

一阶数字高通滤波器
本文的主要内容包含一阶高通滤波器公式的推导和数字算法的实现以及编程和仿真 1 计算公式推导 1.1.2 算法实现及仿真 利用python实现的代码如下: import numpy as np # from scipy.signal import butter, lfilter, freqz import matplotlib.pyplot as plt #2pifW…...

Linux多线程系列2: 模拟封装简易语言级线程库,线程互斥和锁,线程同步和条件变量,线程其他知识点
Linux多线程系列2: 模拟封装简易语言级线程库,线程互斥和互斥锁,线程同步和条件变量,线程其他知识点 1.前言 一.模拟C11线程库自己封装简易语言级线程库1.实现框架2.迅速把构造等等函数写完3.start和work1.尝试一2.尝试二3.最终版本4.给出代码 二.模拟实现多线程(为编写线程池做…...

VUE3-form表单保存附件与基本信息
element-ui代码 <el-dialog :title"上传附件" v-model"dialogAdds.visible" width"500px" append-to-body> <el-form-item label"唯一标识"> <dict-tag v-if"form.groupId" :options"unique_identifica…...

无线网络安全技术基础
无线网络安全技术基础 无线网络安全风险和隐患 随着无线网络技术广泛应用,其安全性越来越引起关注.无线网络的安全主要有访问控制和数据加密,访问控制保证机密数据只能由授权用户访问,而数据加密则要求发送的数据只能被授权用户所接受和使用。 无线网络在数据传输时以微波进…...

sheng的学习笔记-docker部署Greenplum
目录 docker安装gp数据库 mac版本 搭建gp数据库 连接数据库 windows版本 搭建gp数据库 连接数据库 docker安装gp数据库 mac版本 搭建gp数据库 打开终端,输入代码,查看版本 ocker search greenplum docker pull projectairws/greenplum docker…...

【投稿资讯】区块链会议CCF A -- SP 2025 截止6.6、11.14 附录用率
会议名称:46th IEEE Symposium on Security and Privacy( S&P) CCF等级:CCF A类学术会议 类别:网络与信息安全 录用率:2023年 195/1147,2024年录用了17篇和区块链相关的论文 Topics of interest inc…...

C++哪些函数不能被声明为虚函数
在C中,某些函数不能被声明为虚函数。下面详细解释哪些函数不能被声明为虚函数,并通过代码示例进行说明。 C哪些函数不能被声明为虚函数 不能声明为虚函数的函数示例代码及解释一、构造函数不能是虚函数二、静态成员函数不能是虚函数三、友元函数不能是虚…...

vue中数据已经改变了,但是table里面内容没更新渲染!
解决方案: 给table或者el-table标签上添加一个动态key值,只要数据发生改变,key值变动一下即可 标签上: :key“timeStamp” 初始data:timeStamp:0, 更新数据:this.timeStamp 这样每次更新数据ÿ…...

头歌实践教学平台:Junit实训入门篇
第2关:Junit注解 任务描述 给出一个带有注解的Junit代码及其代码打印输出,要求学员修改注解位置,让输出结果变为逆序。 相关知识 Junit注解 Java注解((Annotation)的使用方法是" 注解名" 。借助注解&a…...

matlab使用教程(80)—修改图形对象的透明度
1.更改图像、填充或曲面的透明度 此示例说明如何修改图像、填充或曲面的透明度。 1.1坐标区框中所有对象的透明度 透明度值称为 alpha 值。使用 alpha 函数设置当前坐标区范围内所有图像、填充或曲面对象的透明度。指定一个介于 0(完全透明)和 1&#x…...

mysql bin 日志转成sql
首先确定mysql binlog 服务开启 SHOW VARIABLES LIKE log_bin; 找到binlog日志 find / -name mysql-bin.* -type f 下载下来 本地找到mysql安装位置的bin目录 在窗口路径处直接输入cmd 执行 mysqlbinlog --no-defaults --base64-outputdecode-rows -v --start-datetime&…...

河南道路与桥梁乙级资质申请:注册证书与职称证书准备
在河南道路与桥梁乙级资质申请中,注册证书与职称证书的准备是不可或缺的环节。以下是关于如何准备这些证书的一些关键步骤和要点: 明确所需证书类型: 注册证书:这通常指的是相关专业的注册工程师证书,如注册土木工程师…...

3D工业视觉
前言 本文主要介绍3D视觉技术、工业领域的应用、市场格局等,主要技术包括激光三角测量、结构光、ToF、立体视觉。 一、核心内容 3D视觉技术满足工业领域更高精度、更高速度、更柔性化的需求,扩大工业自动化的场景。 2D视觉技术基于物体平面轮廓&#…...

使用auth_basic模块进行基础认证
在建立和维护Web服务器时,身份认证是一个至关重要的环节。Nginx作为一个高性能的Web服务器,支持许多认证方法,其中较为简单和常用的一种即是基础身份认证(Basic Authentication),这需要借助auth_basic模块实…...

深度解析物联网平台:优化数据点位管理的实战策略
策略管理 策略,作为在物联网平台数据点位创建过程中可设定的规则,涵盖了多个重要方面,策略是在创建点位的时候,可以设置的规则,包括存储策略、告警策略、通知策略以及联动策略。这些策略都是通过专门的列表页面进行集…...

Spring常见问题
如何理解spring属于低侵入式设计? 在代码中不需要写明具体依赖对象,在运行时进行自动注入,降低了组件的耦合依赖的是接口,而接口的实现类具有拓展性 Spring IOC 实现了什么功能,谈谈你对IOC的理解。 负责创建对象&…...

MiniMax Golang2轮面试,期望薪资25K
一面 1、自我介绍 2、简单介绍一下你们成立了这个finance的财务中台之后,整体的服务架构是怎么样的吗? 3、就你提到的预算池项目,展开说说背景,以及解决了怎么样的问题? 4、为什么采用针对T-1订单的异步计算方案&a…...

MyBatis系统学习篇 - MyBatis的缓存
MyBatis的缓存实现原理主要基于三级缓存机制,包括一级缓存(本地缓存)、二级缓存(全局缓存)和三级缓存(跨会话缓存)。这个缓存在我们实际开发中可以避免我们查询重复的数据,在一定程度…...

K-means聚类模型
目录 1.定义 2.K-means聚类模型的优点 3.K-means聚类模型的缺点 4.K-means聚类模型的应用场景 5.对K-means聚类模型未来的展望 6.小结 1.定义 什么是 K-means 聚类模型?K-means 聚类模型是一种无监督学习算法,用于将数据划分为不同的组或簇&#…...

免费分享一套微信小程序旅游推荐(智慧旅游)系统(SpringBoot后端+Vue管理端)【论文+源码+SQL脚本】,帅呆了~~
大家好,我是java1234_小锋老师,看到一个不错的微信小程序旅游推荐(智慧旅游)系统(SpringBoot后端Vue管理端)【论文源码SQL脚本】,分享下哈。 项目视频演示 【免费】微信小程序旅游推荐(智慧旅游)系统(SpringBoot后端Vue管理端) Java毕业设计…...

Matlab 2023b学习笔记1——界面认识
下载安装好Matlab后,可以看到如下界面: 可以看到,这时只有命令行窗口。我们在上方工具栏中选择“布局”—— “默认”,即可看到左右两边多出来了“当前文件夹”与“工作区”两栏。 一、当前文件夹界面 这个界面显示的是当前目录下…...

C++ sort排序的总和应用题
第1题 sort排序1 时限:1s 空间:256m 输入n个数,将这n个数从小到大排序,输出。 输入格式 第1行,一个正整数n(n<100) 第2行,n个正整数,小于100 输出格式 n个整…...

[力扣]——231.2的幂
题目描述: 给你一个整数 n,请你判断该整数是否是 2 的幂次方。如果是,返回 true ;否则,返回 false 。 如果存在一个整数 x 使得 n 2x ,则认为 n 是 2 的幂次方。 bool isPowerOfTwo(int n){ if(n0)retur…...

【css】引入背景图时候,路径写入@会报错
看报错信息 我的写法 解决办法 在前面加个~...

【有手就行】使用你自己的声音做语音合成,CPU都能跑,亲测有效
此文介绍在百度飞桨上一个公开的案例,亲测有效。 厌倦了前篇一律的TTS音色了吗?打开短视频听来听去就是那几个声音,快来试试使用你自己的声音来做语音合成吧!本教程非常简单,只需要你能够上传自己的音频数据就可以(建议…...

《ESP8266通信指南》番外-(附完整代码)ESP8266获取DHT11接入(基于Lua)
前言 此篇为番外篇,是 ESP8266 入门的其他功能教程,包括但不限于 DHT11 驱动TCP 通信Thingsboard 平台的接入阿里云物联网云平台接入华为云平台接入 1. 小节目标 使用 Lua 驱动 DHT11 传感器,获取温湿度的值 2. 进入主题 NodeMCU 基于 LUA 相关资料 官方文档:…...

[IMX6ULL驱动开发]-Linux对中断的处理(一)
目录 中断概念的引入 ARM架构中断的流程 异常向量表 Linux系统对中断的处理 ARM对程序和中断的处理 Linux进程中断处理 中断概念的引入 如何理解中断,我们可以进行如下抽象。把CPU看做一个母亲,当它正在执行任务的时候,可以看为是一个母…...

PHP基础学习笔记(面向对象OOP)
类和对象 <?php //声明一个名为 Fruit 的类,它包含两个属性($name 和 $color)以及两个用于设置和获取 $name 属性的方法 set_name() 和 get_name(): class Fruit {// Propertiespublic $name;public $color;// Methodsfuncti…...

Mysql超详细安装配置教程(保姆级图文)
MySQL是一种流行的开源关系型数据库管理系统,它广泛用于网站和服务的数据存储和管理。MySQL以其高性能、可靠性和易用性而闻名,是许多Web应用程序的首选数据库解决方案之一。 一、下载安装包 (1)从网盘下载安装文件 点击此处直…...