C进阶:内存操作函数

news2024/11/28 16:44:36

内存操作函数

memcpy

头文件:string.h

基本用途:进行不相关(不重叠的内存)拷贝。

函数原型:void* memcpy(void* destination,//指向目标数据的指针

                                            const void* source,//指向被拷贝数据的指针

                                            size_t num);//拷贝的数量(单位:字节)

注:

1.基本原理:从source的位置开始向后复制num个字节的数据到destnation的内存位置。

2.这个函数与strcpy不同,它遇见'\0'的时候并不会停下来。

3.如果source和destnation有任何的重叠,复制的结果都是未定义的。

4.void* 之前讲过,为了保证泛用性,使用void*接收任意类型的数据。

使用举例:

#include <stdio.h>
#include <string.h>

struct {
	char name[40];
	int age;
}person, person_copy;

int main()
{
	char myname[] = "Pierre de Fermat";
	
	memcpy(person.name, myname, strlen(myname) + 1);
	person.age = 46;

	memcpy(&person_copy, &person, sizeof(person));
	printf("person_copy: %s , %d\n", person_copy.name, person_copy.age);
	return 0;
}

这是将字符串和结构体成员变量拷贝到另一个结构体的举例。

为了更好的理解这一函数,下面我们来模拟实现一下它。

void* my_memcpy(void* dest, const void* src, size_t num)
{
	//断言,防止dest或者src是空指针,如果是空指针则会报错
	assert(dest && src);
	//保存起始地址
	void* ret = dest;
	while (num--)
	{
		//一次用最小单位(字节)移动,保证泛用性
		*(char*)dest = *(char*)src;
		//注:强制类型转换只是临时的,后面+1操作时已不存在
		dest = (char*)dest + 1;
		src = (char*)src + 1;
	}
	//返回目标空间的起始地址
	return ret;
}

memmove

头文件:string.h

基本用途:重叠内存块的拷贝

函数原型:void* memove(void* destnation, const void* source, size_t num)

注:

1.和memcpy的区别就是memove函数处理的源内存块和目标内存块可以重叠。

2.如果原空间和目标空间出现重叠,就得使用memmove函数处理。

使用举例:

#include <stdio.h>
#include <string.h>

int main()
{
	char str[] = "memmove can be very useful.....................";
	//将字符串中从第15个元素的位置向后数共11个字符挪到从第20个字符开始向后数第11个元素
	memmove(str + 20, str + 15, 11);
	puts(str);
	return 0;
}

该函数的模拟实现:

#include <stdio.h>
#include <string.h>
#include <assert.h>

void* my_memmove(void* dest, const void* src, size_t num)
{
	assert(dest && src);
	//当目标位置地址小于源内存块数据地址时,采用从前向后拷贝的方式
	if (dest < src)
	{
		//根据字节数量一个一个移动内存单元
		while (num--)
		{
			*(char*)dest = *(char*)src;
			//向后移动一位
			dest = (char*)dest + 1;
			src = (char*)dest + 1;
		}
	}
	//当目标为指针大于源内存块数据地址时,采用从后向前的拷贝方式
	else if (dest > src)
	{
		//将dest和src指针定位到各自最后的内存地址处
		dest = (char*)dest + num - 1;
		src = (char*)src + num - 1;
		//根据字节数量一个一个移动内存单元
		while (num--)
		{
			*(char*)dest = *(char*)src;
			//向前移动一位
			dest = (char*)dest - 1;
			src = (char*)src - 1;
		}
	}
}

memcmp

头文件:stdio.h

基本用途:顾名思义,与strcmp函数类似,这个函数是比较内存数据大小的(逐字节)。

函数原型:int memcmp(const void* ptr1, const void* ptr2, size_t num);

注:

1.比较从ptr1和ptr2开始的num个字节

2.与strcmp返回值类似,仍是第一个指针内容大于第二个指针的内容,返回大于零的数字,第一个指针内容小于第二个指针的内容,返回小于零的数字,相等,返回零。

基本举例:

#include <stdio.h>
#include <string.h>

int main()
{
	char buffer1[] = "axxxxxxxxxxx";
	char buffer2[] = "bbbbbbbbbbbb";

	int n;
	n = memcmp(buffer1, buffer2, sizeof(buffer1));
	printf("%d", n);
	return 0;
}

结果:

这期的博客就分享到这里啦,谢谢各位啦!!! 

 

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

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

相关文章

ES6解构对象、数组、函数传参

目录 1.对象解构 2.对象解构的细节处理 2.1.解构的值对象中不存在时 2.2.给予解构值默认参数 2.3.非同名属性解构 3.数组解构 3.1基础解构语法 3.2数组嵌套解构 4.函数解构传参 5.解构小练习 在ES6的新语法中新增了解构的方法&#xff0c;它可以让我们很方便的从数组或…

如何实现两个对象之间的属性拷贝

两个对象之间的属性拷贝 你可以使用Java的BeanUtils类或类似工具来实现两个对象之间的属性拷贝。以下是一个示例代码&#xff1a; import org.apache.commons.beanutils.BeanUtils;public class CopyPropertiesExample {public static void main(String[] args) throws Excep…

java学习路程之篇一、进阶知识、面向对象高级、static关键字、继承、final关键字、this、super

文章目录 面向对象高级static关键字继承final关键字 面向对象高级 static关键字 继承 final关键字

【统计课堂】SPSS统计分析- R×C列联表资料统计方法的选择

之前我们提到RC列联表资料&#xff0c;列联表根据变量是否有序可以分为双向无序、单项有序、双向有序列联表&#xff0c;他们的统计方法是不同的 一、双向无序列联表 双向无序列联表是指行、列变量均为无序的列联表&#xff0c;比如不同污染地区的动物畸形率是否有差异&#x…

RT1052的时钟

文章目录 时钟主时钟图时钟树 系统时钟 时钟 主时钟图表明了各个 PLL 时钟&#xff08;总共 7 个 PLL&#xff09;的由来和通路&#xff1b;时钟树图&#xff0c;则表明了 RT1052 内部各个根时钟&#xff08;CLK ROOT&#xff09;的由来和通路。 主时钟图 图中总共有7个PLL&…

mybatis sql 参数自动填充

项目中打印sql&#xff0c;参数都是需要自己复制进去,很不方便&#xff0c;例如: Preparing: SELECT id,product_code,product_name,del_flag,create_time,create_by,update_time,update_by,remark FROM product_info WHERE (del_flag ?) LIMIT ? > Parameters: false(B…

结构型设计模式之外观模式【设计模式系列】

系列文章目录 C技能系列 Linux通信架构系列 C高性能优化编程系列 深入理解软件架构设计系列 高级C并发线程编程 设计模式系列 期待你的关注哦&#xff01;&#xff01;&#xff01; 现在的一切都是为将来的梦想编织翅膀&#xff0c;让梦想在现实中展翅高飞。 Now everythi…

DNS协议详解

DNS协议详解 DNS协议介绍DNS解析过程DNS查询的方式递归查询迭代查询区别 DNS协议介绍 DNS 协议是一个应用层协议&#xff0c;它建立在 UDP 或 TCP 协议之上&#xff0c;默认使用 53 号端口。该协议的功能就是将人类可读的域名 (如&#xff0c;www.qq.com) 转换为机器可读的 IP…

【深度学习】RNN学习笔记

RNN学习笔记 时间序列 将单词序列转换为向量&#xff0c;这里有五个单词&#xff0c;然后对于每一个单词都进行独热编码&#xff0c;编码成一个特定的向量。 对于RNN网络&#xff0c;需要一次性读取多个句子&#xff0c;那么涉及到batch_size&#xff0c;这里第二个表达就是&a…

Vue上传图片返回base64并在页面展示,并图片上canvas进行红框框选标记

https://www.cnblogs.com/szqtiger/p/12100754.html vue如何显示base64图片_vue显示base64_不断学习的码农的博客-CSDN博客 图片上进行红框框选_时小帅的博客-CSDN博客 设置canvas画布大小_canvas设置画布大小_最凶残的小海豹的博客-CSDN博客 图片回显 结合以上&#xff0…

MySQL8 新特性——窗口函数用法

MySQL8 新特性——窗口函数用法 MySQL 8.0 是 MySQL 数据库管理系统的一个重要版本&#xff0c;引入了许多新特性和改进。以下是 MySQL 8.0 的一些主要新特性&#xff1a; 事务隔离级别改进&#xff1a; MySQL 8.0 引入了新的事务隔离级别 SERIALIZABLE&#xff0c;提供了最高…

妙记多 Mojidoc PC端(Mac 端+windows端)Beta版本正式上线!

你们呼唤了无数次的妙记多 Mojidoc PC客户端 Beta版本正式上线啦&#xff01; 感谢300位妙友积极参与内测&#xff0c;给予了我们很多非常有效的意见和建议&#xff01;我们会根据用户反馈不断优化和修复相关功能&#xff0c;在此感谢妙友们一直以来的支持&#xff5e; PC端拥…

静态html引入ucharts并直接使用组件标签

由于官方不能直接使用qiun-vue-ucharts在静态html页面使用。 DIY可视化对此类库进行了改进&#xff0c;把它的包独立打包成一个可以依赖的JS。 首先定义一个核心JS&#xff0c;用于打包生成uchart import qiunVueUcharts from qiun/vue-ucharts;const install (app) > {…

el-select实现el-option可编辑

鼠标悬浮出现编辑图标 点击编辑图标对选择项进行修改 核心代码如下&#xff0c;注意el-input不要使用focus&#xff0c;会导致el-select面板收起来&#xff1b;使用click.native.stop即可 <el-select v-model"value" placeholder"选择" style"widt…

酷雷曼无人机技能培训考试圆满举办

2023年7月18日、19日&#xff0c;以“向云端起航&#xff0c;让技术落地”为主题的酷雷曼无人机技能提升培训会在酷雷曼北京运营中心隆重举行&#xff0c;来自全国各地的众多合作商参加了本次培训&#xff0c;通过系统、全面的学习成功取得了专业无人机飞行员执照&#xff0c;为…

基于linux下的高并发服务器开发(第三章)- 3.10 死锁

deadlock.c #include <stdio.h> #include <pthread.h> #include <unistd.h>// 全局变量&#xff0c;所有的线程都共享这一份资源。 int tickets 1000;// 创建一个互斥量 pthread_mutex_t mutex;void * sellticket(void * arg) {// 卖票while(1) {// 加锁pt…

十、正则表达式详解:掌握强大的文本处理工具(二)

文章目录 &#x1f340;多字符匹配&#x1f340;匹配规则的代替&#x1f340;特殊的匹配&#x1f340;特殊的匹配plus&#x1f340;总结 &#x1f340;多字符匹配 星号&#xff08;*&#xff09;&#xff1a;匹配0个或者多个字符 import retext 111-222-333 result re.matc…

Cardboard for Pictures(cf)

Mircea有n张照片&#xff0c;第 i 张照片的是边长为si的正方形&#xff0c;他把每张照片都装在一块正方形的硬纸板上&#xff0c;这样每张照片的四周都有一个w厘米的硬纸板边框。他总共用了 c 立方厘米见方的硬纸板。给定图片大小和值c&#xff0c;求w。&#xff08;请注意&…

Java-API简析_java.net.InetSocketAddress类(基于 Latest JDK)(浅析源码)

【版权声明】未经博主同意&#xff0c;谢绝转载&#xff01;&#xff08;请尊重原创&#xff0c;博主保留追究权&#xff09; https://blog.csdn.net/m0_69908381/article/details/131870760 出自【进步*于辰的博客】 因为我发现目前&#xff0c;我对Java-API的学习意识比较薄弱…

Dubbogo 详解

Dubbogo 详解 简介 dubbo功能很强大的微服务开发框架&#xff0c;支持多种通信协议&#xff0c;并具有流量治理的功能。 dubbo在有了大转变&#xff0c;拥抱了云原生&#xff0c;从哪些方面可以体现呢&#xff1f; 推出了自己的Trip协议修复了服务发现的级别&#xff0c;之…