来不及哀悼了,接下来上场的是C语言内存函数memcpy,memmove,memset,memcmp

这篇具有很好参考价值的文章主要介绍了来不及哀悼了,接下来上场的是C语言内存函数memcpy,memmove,memset,memcmp。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

今天又来写一篇C的文章,这里要讲的是C语言中的几个内存函数,主要是讲解功能和用法,望能耐心观看哦。望官方也多多曝光。

目录

memcpy

 memmove

memset

 memcmp



memcpy

 memcpy  是 C 语言标准库中的一个函数,用于复制内存块的内容。它的主要作用是将一个源内存区域的内容复制到另一个目标内存区域,且是按照所给字节数进行复制。
 来不及哀悼了,接下来上场的是C语言内存函数memcpy,memmove,memset,memcmp,C语言,c语言,开发语言,visualstudio
函数原型:
 
 

void *memcpy(void *dest, const void *src, size_t n);



 
参数说明:
 
 dest :指向目标内存区域的指针,复制的结果将存储在这个位置。
  src :指向源内存区域的指针,要复制的内容将从这个位置读取。
  n :要复制的字节数。

 
函数行为:
 
1.  memcpy  会从源内存区域复制指定数量的字节到目标内存区域。
2. 复制是按字节进行的,不考虑数据类型或字节序。
3. 函数返回指向目标内存区域的指针。

 
代码使用例子:

#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);
	int i = 0;
	for (i = 0; i < 10; i++)
	{
		printf("%d ", arr2[i]);
	}
	return 0;
}

来不及哀悼了,接下来上场的是C语言内存函数memcpy,memmove,memset,memcmp,C语言,c语言,开发语言,visualstudio 

代码解析:上面代码中我们调用函数memcpy函数,进行传参,将arr1前20个字节的内容,复制到arr2中。根据结果确实如此,20个字节为5个整形元素大小,所以这里从arr1中1,2,3,4,5 复制到arr2中,至于后面的5个0,是因为在VS中如果未对数组中进行初始化的元素,会默认为0.


为了让大家更了解这个函数,这里为大家模拟实现一下memcpy函数:

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*的指针是因为让指针dst和src都是一个一个字节的往后访问。 

 需要注意的是:memcpy是不能对两个有重叠部分的指针完成准确的复制的,所以我们需要看下一个有重叠部分也可以完成操作的函数memmove。


 memmove

 memmove  是 C 语言标准库中的一个函数,它与  memcpy  类似,用于复制内存块的内容。与  memcpy  不同的是, memmove  可以在源和目标内存区域有重叠的情况下安全地进行复制。
 
来不及哀悼了,接下来上场的是C语言内存函数memcpy,memmove,memset,memcmp,C语言,c语言,开发语言,visualstudio
函数原型:
 

 

void *memmove(void *dest, const void *src, size_t n);


 
 参数说明:
 

 dest :指向目标内存区域的指针,复制的结果将存储在这个位置。
  src :指向源内存区域的指针,要复制的内容将从这个位置读取。
  n :要复制的字节数。

 
函数行为:
 
1.  memmove  用于在不同的内存位置之间复制数据,即使源和目标区域有重叠也能正确工作。
2. 它会根据源和目标的相对位置,以适当的方式复制数据,确保结果是正确的。


 
代码简单使用例子:

#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 ", arr1[i]);
	}
	return 0;
}

来不及哀悼了,接下来上场的是C语言内存函数memcpy,memmove,memset,memcmp,C语言,c语言,开发语言,visualstudio

 

代码解析:这里很明显即使我们调用memmove函数时传过去的指针地址是明显有重叠部分的,但是这里我们看见结果确实是没问题的,将arr的前20个字节即5个元素复制到arr+2往后的元素。 


还是为了大家更好理解函数的逻辑,给大家模拟实现一下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);
}

 这里面强制转化为char*的指针是因为让指针dst和src都是一个一个字节的往后访问。 


memset

 memset  是 C 语言标准库中的一个函数,用于将指定的内存区域填充为特定的值。
 
来不及哀悼了,接下来上场的是C语言内存函数memcpy,memmove,memset,memcmp,C语言,c语言,开发语言,visualstudio
函数原型:
 
 

void *memset(void *str, int c, size_t n);


 
 
参数说明:
 
 str :指向要填充的内存区域的指针。
 c :要填充的特定值。通常是一个整数类型的值。
 n :要填充的字节数。

 
函数行为:
 
1.  memset  使用指定的值  c  填充内存区域的前  n  个字节。
2. 填充是按字节进行的,无论内存区域的实际数据类型如何。


 
简单代码使用例子:

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

 来不及哀悼了,接下来上场的是C语言内存函数memcpy,memmove,memset,memcmp,C语言,c语言,开发语言,visualstudio

函数较为简单就不多加解释了。 


 memcmp

memcmp是一个用于比较内存区域的函数

来不及哀悼了,接下来上场的是C语言内存函数memcpy,memmove,memset,memcmp,C语言,c语言,开发语言,visualstudio

 函数原型:

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

 

参数说明:两个需要比较的内存块的起始地址 ptr1 和 ptr2,以及需要比较的字节数 num。

函数行为:

函数会比较 ptr1 和 ptr2 指向的内存块前 num 个字节的内容,返回值为整型,表示比较结果:如果两个内存块的前 num 个字节完全相等,则返回0;如果 ptr1 指向的内存块小于 ptr2 指向的内存块,则返回负数;如果 ptr1 指向的内存块大于 ptr2 指向的内存块,则返回正数。
 

代码简单实用例子:

#include <stdio.h>
#include <string.h>
int main()
{
	char buffer1[] = "hello";
	char buffer2[] = "good";
	int n;
	n = memcmp(buffer1, buffer2, sizeof(buffer1));
	if (n > 0)
		printf("'%s' 比 '%s'大.\n", buffer1, buffer2);
	else if (n < 0)
		printf("'%s' 比 '%s'小.\n", buffer1, buffer2);
	else
		printf("'%s' 与 '%s'一样大.\n", buffer1, buffer2);
	return 0;
}

 来不及哀悼了,接下来上场的是C语言内存函数memcpy,memmove,memset,memcmp,C语言,c语言,开发语言,visualstudio


今天文章就结束了,觉得有用,可以点个赞再走唔。来不及哀悼了,接下来上场的是C语言内存函数memcpy,memmove,memset,memcmp,C语言,c语言,开发语言,visualstudio 文章来源地址https://www.toymoban.com/news/detail-835314.html

到了这里,关于来不及哀悼了,接下来上场的是C语言内存函数memcpy,memmove,memset,memcmp的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 接下来讲一讲Vue的数据代理

    首先讲一下原生js的数据代理 原生的  Object.defineProperty() 可以通过这个方法动态的为对象添加字段,并未对象字段设置数据代理 vue中的数据代理 这段代码应该见怪不怪了,我们创建vue对象的时候会创建一个data对象传给_data,实际上data和vm中的_data就是完全一样的,我们修改其

    2024年02月17日
    浏览(31)
  • 我从来不理解JavaScript闭包,但我用了它好多年

    前言  📫 大家好,我是南木元元,热衷分享有趣实用的文章,希望大家多多支持,一起进步!  🍅  个人主页: 南木元元 你是否学习了很久JavaScript但还没有搞懂闭包呢?今天就来聊一下被很多人誉为JavaScript中最难理解的概念之一的闭包。 目录 闭包的概念 闭包产生的原因

    2024年02月05日
    浏览(36)
  • 懂点自动化基础就要25k? 面试官:给你10K,爱来不来

    公司前段缺人,也面了不少测试,结果竟然没有一个合适的。 一开始瞄准的就是中级的水准,也没指望来大牛,提供的薪资在10-25k,面试的人很多,但平均水平很让人失望。看简历很多都是3年工作经验, 但面试中,不提测试工具,仅仅基础的技术很多也知之不详,多数人数

    2024年02月07日
    浏览(32)
  • 梅斯健康再冲刺上市:研发投入远不及营销费用,启明、腾讯为股东

    撰稿|汤汤 来源|贝多财经 日前,梅斯健康控股有限公司(下称“梅斯健康”)再次向港交所递交招股书,准备在港交所主板上市,中金公司和MACQUARIE为其联席保荐人。据贝多财经了解,这是梅斯健康第二次递表。  贝多财经了解到,梅斯健康的全称为上海梅斯医药科技有限公

    2024年02月04日
    浏览(84)
  • SSH连接下Git fetch/pull/push 速度太慢的一些解决办法

    有时候某些git的代码库在fetch远端的时候会非常慢,速度只有几十k或者几k。这个速度拉取一整个代码库可能要花费一晚上或者一天时间。甚至在每天更新已有代码库时候也会花上十分钟。可以尝试一下这些方法来提升拉取远端代码的速度: 1. Git 版本过低的话可能会导致这个

    2024年02月10日
    浏览(46)
  • Spring Boot 宣布移除 run 命令,真让我猝不及防。。。

    大家好,我是栈长。 昨天有粉丝反馈栈长《Spring Boot 核心技术课》中的一个问题: Spring Boot CLI 命令行工具中的 run 命令找不到了? 这是什么鬼?后面为你揭晓原由! Spring Boot CLI 全称即: Spring Boot Command-Line Interface ,是一个构造 Spring Boot 项目命令行工具,可用于从 start.sp

    2024年02月10日
    浏览(33)
  • 不合格机器人工程专业讲师的“急于求成”和“过犹不及”

    1. 智能机器人方向大学本科部分教学素材整理(2018) 2. 写给未来的自己 3.  机器人工程的工作与考研之困惑“效果越来越差”   慢+简+静 断+舍+离 好像所有人都很累。 “急于求成”,“拔苗助长”这些词语意思很直白。 在机器人工程学习中,不管是学生,还是老师都会

    2024年02月19日
    浏览(30)
  • 澜沧古茶在港交所上市申请失效:收入不及八马茶业,股东提前套现

    12月1日,贝多财经从港交所披露易了解到,普洱澜沧古茶股份有限公司(下称“澜沧古茶”)的上市申请材料失效,目前已无法正常查看或下载。据贝多财经了解,“失效”并不意味着上市失败。  事实上,招股书“失效”是港交所的正常机制,代表拟发行人的财务审计数据

    2024年02月08日
    浏览(45)
  • “被裁员之前,没得到任何风声,措手不及...” 一个在职6年测试工程师内心独白

    一个码农(软件测试工程师)的自白 小张: 我们用工作五年的积蓄,在这个一线城市买了房子,买了车子,然后领证。我也在6年前进入了一个很多人梦寐以求新的公司 码农的新生活开始了。在这家公司里,我第一次真正领略到“人外有人,天外有天”的含义。所在的团队各

    2023年04月24日
    浏览(38)
  • Git clone下来的分支不完整

    将仓库 git clone 到本地后发现本地缺失了一些远程仓库的分支。一般发生在 git clone —depth 1 设置克隆深度时发生。因为有些大型项目一次性克隆容易出错,所以只克隆一层深度。 如远程有分支 branch_a ,克隆下来后使用 git branch -av 命令查看所有分支没有显示该分支,该如何解

    2024年02月16日
    浏览(48)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包