C进阶_内存库函数

news2024/11/24 14:24:07

目录

memcpy

模拟实现memcpy

memmove

模拟实现memmove

memcmp


memcpy

它的函数原型为:

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

函数memcpy从source的位置开始向后复制num个字节的数据到destination的内存位置。

这个函数在遇到 '\0' 的时候并不会停下来。

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

例子:

#include <stdio.h>
#include <string.h>
struct
{
	char name[40];
	int age;
} person, person_copy;
int main()
{
	char myname[] = "Pierre de Fermat";
	//用memcpy拷贝字符串
	memcpy(person.name, myname, strlen(myname) + 1);
	person.age = 46;
	//用memcpy拷贝结构体
	memcpy(&person_copy, &person, sizeof(person));
	printf("person_copy: %s, %d \n", person_copy.name, person_copy.age);
	return 0;
}

输出结果为:

模拟实现memcpy

void* memcpy(void* dst, const void* src, size_t count)
{
	void* ret = dst;
	assert(dst);
	assert(src);
	//拷贝从低地址到高地址
	while (count--) {
		*(char*)dst = *(char*)src;
		dst = (char*)dst + 1;
		src = (char*)src + 1;
	}
	return(ret);
}

memmove

memmove的函数原型是:

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

和memcpy的差别就是memmove函数处理的源内存块和目标内存块是可以重叠的。

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

例子:

#include <stdio.h>
#include <string.h>
int main()
{
	char str[] = "memmove can be very useful......";
	memmove(str + 20, str + 15, 11);
	puts(str);
	return 0;
}

输出结果为:

模拟实现memmove


void* memmove(void* dst, const void* src, size_t count)
{
	void* ret = dst;
	if (dst <= src || (char*)dst >= ((char*)src + count)) {
		/*
		* Non-Overlapping Buffers* copy from lower addresses to higher addresses
*/
		while (count--) {
			*(char*)dst = *(char*)src;
			dst = (char*)dst + 1;
			src = (char*)src + 1;
		}
	}
	else {
		/*
		* Overlapping Buffers
		* copy from higher addresses to lower addresses
		*/
		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);
}

memcmp

它的函数原型为:

int memcmp( const void *buf1, const void *buf2, size_t count );

作用是比较从ptr1和ptr2指针开始的num个字节。

查找它的文档:

Return Value

The return value indicates the relationship between the buffers.

Return ValueRelationship of First count Bytes of buf1 and buf2
< 0buf1 less than buf2
0buf1 identical to buf2
> 0buf1 greater than buf2

由此可知buf1小于buf2时返回值小于0,buf1等于buf2时返回值为0,buf1大于buf2时返回值大于0。

例子:

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);
}

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

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

相关文章

104、【树与二叉树】leetcode ——98. 验证二叉搜索树:递归法[先序+中序+后序]+迭代法(C++版本)

题目描述 原题链接&#xff1a;98. 验证二叉搜索树 解题思路 BST的特点是&#xff1a;当前结点的值&#xff0c;比左子树中的全部结点都大&#xff0c;比右子树中全部结点都小。在代码实现中&#xff0c;要注意不要对比的是某一结点和某一侧的全部值之间的关系&#xff0c;不…

【论文阅读】CenterNet

论文题目&#xff1a;Objects as Points&#xff08;CVPR2019&#xff09; 论文地址&#xff1a;https://arxiv.org/pdf/1904.07850.pdf 发布时间&#xff1a;2019.4.16 机构&#xff1a;UT Austin&#xff0c;UC Berkeley 代码&#xff1a;https://github.com/xingyizhou/…

小程序事件基础

小程序事件--基础小程序事件事件简介小程序事件—事件传参事件对象属性target和currentTarget事件对象属性获取和设置data数据获取&设置data获取和设置data数据—进阶小程序的渲染层与逻辑层小程序事件 事件简介 事件是视图层到逻辑层的通讯方式。负责将用户对于的页面的操…

云上的米开朗基罗:在不确定时代,寻找建筑般的确定性

文艺复兴三杰之一的米开朗基罗&#xff0c;被称为“天才建筑师”。其实他一生留下的建筑并不多&#xff0c;仅仅有美第奇礼拜堂、卡比多广场、圣彼得大教堂穹顶等寥寥几座。但米开朗基罗却凭借对建筑层次与结构的精妙把握&#xff0c;影响了此后数百年的建筑风格。很多人认为&a…

【代码随想录】动态规划:关于01背包问题,你该了解这些!(滚动数组)

01 背包 有n件物品和一个最多能背重量为w的背包 第i件物品的重量是weight[i]&#xff0c; 得到的价值是value[i] &#xff0c; 每件物品只能用一次&#xff0c;求解将哪些物品装入背包里物品价值总和最大。 每一件物品其实只有两个状态&#xff0c;取或者不取&#xff0c;所以…

win下编译opencv+libjpeg-turbo

文章目录前言编译环境下载opencv和jpeg-turbo源码编译jpeg-turbo编译opencv失败&#xff1f;那就直接调用jpeg-turbo库进行编解码前言 opencv默认自带第三方jpeg编解码库&#xff0c;但其性能一般&#xff0c;对高性能需求的程序来说是不适合的&#xff0c;因此我们可以把jpeg…

设计模式学习(八):Proxy代理模式

一、什么是Proxy模式 Proxy是“代理人”的意思&#xff0c;它指的是代替别人进行工作的人。当不一定需要本人亲自进行工作时&#xff0c;就可以寻找代理人去完成工作。但代理人毕竟只是代理人&#xff0c;能代替本人做的事情终究是有限的。因此&#xff0c;当代理人遇到无法自己…

文件上传oss,并查询上传进度(SpringBoot+Redis+Oss+Swagger3)

文章目录诉求技术选型pom配置项目结构文件树图示结构代码实现配置相关配置文件yamlSwagger3配置跨域问题配置oss相关ServiceControllerApplicationSwagger接口操作获取上传文件标识号获取文件上传进度小结诉求 将文件上传到oss&#xff0c;并实时监听上传进度&#xff0c;并将进…

【javaSE】中基本类型和引用类型对象的比较及PriorityQueue中的比较方法

写博客是为了提升自己&#xff0c;也是为了展现自己的学习成果&#xff0c;坚持!坚持!坚持&#xff01;未来是什么样的&#xff0c;闯一闯就知道啦。喜欢就留个关注吧&#xff01;&#xff01;! 目录 一、java对象的比较 1.1java中基本类型的比较 1.2引用对象的比较 1.3引用…

使用云端的GPU进行yolov5的训练

前言本文介绍了使用云端GPU进行yolov5训练环境配置的过程一、创建实例这里使用的是恒源云的GPU服务器&#xff0c;官方网址为恒源云_GPUSHARE-恒源智享云他的用户文档为Tmux - 恒源云用户文档一般的问题在用户文档中都可以找到解决办法。注册并登录后的界面如下图所示。点击云市…

c++11 标准模板(STL)(std::forward_list)(十)

定义于头文件 <forward_list> template< class T, class Allocator std::allocator<T> > class forward_list;(1)(C11 起)namespace pmr { template <class T> using forward_list std::forward_list<T, std::pmr::polymorphic_…

UPerNet:Unified Perceptual Parsing for Scene Understanding论文解读

Unified Perceptual Parsing for Scene Understanding 论文&#xff1a;[1807.10221] Unified Perceptual Parsing for Scene Understanding (arxiv.org) 代码&#xff1a;CSAILVision/unifiedparsing: Codebase and pretrained models for ECCV’18 Unified Perceptual Parsi…

第二章.线性回归以及非线性回归—岭回归

第二章.线性回归以及非线性回归 2.12 岭回归&#xff08;Ridge Regression&#xff09; 1.前期导入&#xff1a; 1).标准方程法[w(XTX)-1XTy]存在的缺陷&#xff1a; 如果数据的特征比样本点还多&#xff0c;数据特征n&#xff0c;样本个数m&#xff0c;如如果n>m&#xf…

5种气血不足的面相

我们常用“气色好”形容人良好的健康状态&#xff0c;反之&#xff0c;气血不足就是不健康的表现。想知道自己是否气血不足&#xff0c;可以从以下几种表现中判断。眼白黄&#xff1a;所谓人老珠黄&#xff0c;就是指眼白的颜色变得浑浊、发黄、有血丝&#xff0c;很可能气血不…

网络编程基础(1)

1 OSI七层模型&#xff08;理论&#xff09; 七层模型&#xff0c;亦称OSI&#xff08;Open System Interconnection&#xff09;。参考模型是国际标准化组织&#xff08;ISO&#xff09;制定的一个用于计算机或通信系统间互联的标准体系&#xff0c;一般称为OSI参考模型或七层…

cycle_gan使用教程

junyanz/pytorch-CycleGAN-and-pix2pix: Image-to-Image Translation in PyTorch (github.com) 如果是用cycle_gan 数据集 /数据集文件夹名&#xff0c;下面四个子文件名 testA testB trainA trainB trainA是A风格图片&#xff0c;trainB是B风格图片。 训练参数 test…

CCF BDCI | 算能赛题决赛选手说明论文-04

基于TPU平台实现人群密度估计 队名&#xff1a;innovation 陈照照 数据科学与大数据技术20级 台州学院 中国-瑞安 479253198qq.com董昊数据科学与大数据技术20级 台州学院 中国-杭州 donghaowifi163.com陈晓聪数据科学与大数据技术20级 台州学院 中国-宁波 2637491…

Golang -- openwechat微信发送消息、自动回复

开篇 马上就要到农历新年了&#xff0c;不妨写一段代码准时为好友们送上祝福。 该 Demo 使用开源项目 openwechat &#xff0c;实现获取好友列表、为好友发送消息、图片或文件&#xff0c;接收来自好友或群组的消息并设置自动回复等功能。 openwechat Github地址 openwechat 文…

管道(匿名,有名)

文章目录Linux 进程间通信的方式管道匿名管道有名管道Linux 进程间通信的方式 管道 管道特点 管道其实是一个在内核内存中维护的缓冲器&#xff0c;这个缓冲器的存储能力是有限的&#xff0c;不同的操作系统大小不一定相同管道拥有文件的特质&#xff1a;读操作、写操作 匿名管…

线扫相机DALSA-变行高拍照

CamExpert在线阵模式中默认的Buffer设置是Fixed Length。在这种设置下&#xff0c;在一帧采集结束前所接收到的新的帧触发信号都会被忽略。在有的应用中&#xff0c;需要新一帧的外触发信号能够中断当前帧的采集&#xff0c;开始新的一帧。这需要将Buffer设为Variable Length。…