C语言内存操作函数,memcpy的使用和模拟实现,memmove的使用和模拟实现,memcmp的使用,memset的使用。

news2024/9/20 1:32:13

1.memcpy

函数原型:

void *memcpy( void *dest, const void *src, size_t count );
  • void *dest 目标数据首元素地址
  • const void *src 源数据(需要拷贝过去的数据)
  • size_t count 需要拷贝数据的字节大小
  • void *memcpy 拷贝结束后,返回目标数据的起始地址

函数作用: 拷贝 count 个字节的数据从源数据起始地址到目标空间。

函数的使用

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

int main() {

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

	return 0;
}

在这里插入图片描述

函数的模拟实现:

#include <assert.h>

void* _memcpy(
	void * dest, 
	const void * src, 
	size_t count
) {
	assert(dest != NULL && src != NULL);

	void* temp = dest;

	while (count) {
		*(char*)dest = *(char*)src;
		dest = (char*)dest + 1;
		src = (char*)src + 1;

		count--;
	}

	return temp;
}

注:
1.memcpystrcpy 的区别是 memcpy 可以拷贝任意类型的数据,但是 strcpy只可以对字符串使用。
2.memcpy 不可以拷贝同一块内存空间的数据。


2.memmove

函数原型:

void *memmove( void *dest, const void *src, size_t count );
  • void *dest 目标数据首元素地址
  • const void *src 源数据(需要拷贝过去的数据)
  • size_t count 需要拷贝数据的字节大小
  • void *memmove 拷贝结束后,返回目标数据的起始地址

函数作用: 拷贝 count 个字节的数据从源数据起始地址到目标空间。与 memcpy不同的是,memmove可以拷贝同一块内存空间的数据。

函数的使用

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

int main() {

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

	return 0;
}

在这里插入图片描述

函数的模拟实现:

#include <assert.h>

void* _memmove(
	void* dest,
	const void* src,
	size_t count
) {
	assert(dest != NULL && src != NULL);

	void* temp = dest;

	if (src < dest) {
		// 从后向前拷贝
		while (count) {
			*((char*)dest + count - 1) = *((char*)src + count - 1);

			count--;
		}
	}
	else {
		// 从前向后拷贝
		while (count) {
			*(char*)dest = *(char*)src;
			dest = (char*)dest + 1;
			src = (char*)src + 1;

			count--;
		}
	}

	return temp;
}

memmove 在实现的过程中,要分两种情况。

  1. src 小于 dest 时,我们需要从后向前拷贝数据,防止数据的覆盖。
  2. src 大于 dest 时,我们需要从前向后拷贝数据,防止数据的覆盖。

3.memcmp

函数原型:

int memcmp( const void *buf1, const void *buf2, size_t count );
  • const void *buf1 数据1首元素地址
  • const void *buf2 数据2首元素地址
  • size_t count 需比较数据的多少个字节
  • int memcmp 返回一个整型
    • > 0 说明第一个数据大于第二个数据
    • < 0 说明第一个数据小于第二个数据
    • = 0 说明两个数据相等

函数作用: 比较 count 个字节两个数据域中的数据是否相等。

函数的使用

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

int main() {
	int nums1[10] = { 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 ,10 };
	int nums2[10] = { 1 , 2 , 3 , 4 , 5 };
	printf("%d" , memcmp(nums1 , nums2 , 20)); // 0

	return 0;
}

在这里插入图片描述


4.memset

函数原型:

void *memset( void *dest, int c, size_t count );
  • void *dest 被填充数据的首元素地址
  • int c 填充的数据
  • size_t count 填充的多少字节的数据
  • void *memset 返回填充后数据的首元素地址

函数作用: 内存空间填充数据。

函数的使用

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

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

	return 0;
}

在这里插入图片描述
注: memset会把数据的每一个字节都填充成你要填充的那个元素。

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

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

相关文章

【简单的图像信息展示应用程序】PYQt5

写在前面的话 这段代码的作用是创建一个简单的图像信息展示应用程序&#xff0c;用户可以点击按钮查看特定文件夹中图像的文件名、大小&#xff0c;并通过查看按钮查看图像。请注意&#xff0c;文件夹路径需要根据实际情况进行修改。 代码讲解 这段代码是使用PyQt5库创建一个…

特征选择:过滤法,嵌入法,包装法

特征选择时首先要去除冗余特征。 它是由其他其他的特征中推演出来的。比如&#xff0c;一个球的体积&#xff0c;那么半径这个特征就是冗余的&#xff0c;因为我们可以由球的体积推算半径。冗余特征在很多时候都是不起作用的 过滤法 过滤方法通常用作预处理步骤&#xff0c;特…

c++11 标准模板(STL)(std::basic_ios)(三)

定义于头文件 <ios> template< class CharT, class Traits std::char_traits<CharT> > class basic_ios : public std::ios_base 类 std::basic_ios 提供设施&#xff0c;以对拥有 std::basic_streambuf 接口的对象赋予接口。数个 std::basic_ios…

2013年全国硕士研究生入学统一考试管理类专业学位联考英语(二)试题

2013考研英语&#xff08;二&#xff09;真题 Section I Use of English Directions: Read the following text. Choose the best word(s) for each numbered blank and mark A, B, C or D on ANSWER SHEET 1. (10 points) Given the advantages of electronic money, you mi…

某农业大学数据结构A-第2周作业

1.两个顺序表集合的差集 【问题描述】两个顺序表集合的差集 【样例输入】 25 33 57 60 48 9 13 0 12 50 23 60 4 34 25 13 0 【样例输出】 33 57 48 9 【注意】0代表输入的结束&#xff1b;可以用C风格实现&#xff0c;也可以用C风格实现&#xff0c;两种风格大家均需掌握 #…

Kafka架构

5.kafka系统的架构 5.1主题topic和分区partition topic Kafka中存储数据的逻辑分类&#xff1b;你可以理解为数据库中“表”的概念&#xff1b; 比如&#xff0c;将app端日志、微信小程序端日志、业务库订单表数据分别放入不同的topic partition分区&#xff08;提升kafka吞…

【Proteus仿真】常用器件名称

前言 我常用的仿真器件加上收集的&#xff0c;基于Proteus8.13版本。以下分为两部分&#xff0c;内容都一样&#xff0c;一部分是纯文字&#xff0c;一部分是文字图片&#xff0c;方便快速获取和定位。等积累了更多的器件后会在更新的。搜索时可以用CtrlF快速查找。 命名的规则…

管理类联考——英语二——技巧篇——写作——B节——议论文——必备替换句型

议论文必备替换句型 (一&#xff09;表示很明显/众所周知的句型 It is obvious thatIt is clear thatIt is apparent thatIt is evident thatlt is self-evident thatIt is manifest thatIt is well-knownIt is known to all thatIt is widely-accepted thatIt is crystal-cl…

三层交换机互联互通配置 华为交换机

#三层交换机互联互通 交换机配置 命令 #进入系统视图 <Huawei>system-view #关闭系统提示信息 [Huawei]undo info-center enable #创建三个Vlan10 [Huawei]vlan 10 [Huawei-vlan10]quit [Huawei]vlan 20 [Huawei-vlan20]quit [Huawei]vlan 30 [Huawei-vlan30]quit #接…

2023六月第二周(juc知识点记录)

1、多线程资源竞争 先创建资源类&#xff0c;并给线程加锁&#xff0c;推荐使用reatrantlock&#xff0c;然后写业务&#xff0c; 加锁了说明肯定要有执行条件&#xff0c;例如抢到锁还要判断库存必须大于0&#xff0c; 否则线程等待await,然后执行业务&#xff0c;最后创建多个…

一分钟图情论文:《运用服务场景模型理解挪威学术图书馆中的学生体验》

一分钟图情论文&#xff1a;《Applying the servicescape model to understand student experiences of a Norwegian academic library》 1981年&#xff0c;Booms, B. H.和Bitner, M. J.1在一篇市场营销学科的论文中引入了Servicescape模型&#xff0c;用于描述和分析服务场所…

无线供电原理、种类及应用方案介绍

目录 一、无线供电种类 二、无线供电的原理 磁共振技术的电路组成 微波能量传输 三、无线供电的优势 四、市场应用 五、市场趋势 参考文献 一、无线供电种类 包含电磁场耦合能量传输&#xff08;电磁磁感应&#xff08;近场供电&#xff09;、磁共振&#xff08;远场供…

easyX库颜色模型和颜色及样式设置相关函数(注释版)

0.颜色模型和颜色及样式设置相关函数概览 本次我给你带了easyX库系列的颜色模型和样式设置的相关函数&#xff0c;希望您能看得开心。 函数或数据类型描述LINESTYLE画线样式对象。FILLSTYLE填充样式对象。setbkcolor设置当前设备绘图背景色。setlinecolor设置当前设备画线颜色…

[易语言][原创]使用易语言部署yolov8的onnx模型

易语言部署yolo系列模型&#xff0c;现在网上有很多但是他们不够简洁也不够专业&#xff0c;有人专门把opencv封装成易语言支持库然后用opencv在易语言端写&#xff0c;其实这种效率没有在C直接推理效率高&#xff0c;因为易语言往C传递图像数据集是需要转换图像数据集格式才能…

十一、docker学习-docker核心之docker网络(1)

docker网络 当开始大规模使用docker时&#xff0c;你会发现需要了解很多关于网络的知识。docker作为目前最火的轻量级容器技术&#xff0c;有很多令人称道的功能&#xff0c;如docker的镜像管理。然而&#xff0c;docker同样有着很多不完善的地方&#xff0c;网络方面就是Dock…

Nexus搭建Maven私有库介绍

为什么需要Maven私有库&#xff1f; 使用Maven获取Java依赖包的时候&#xff0c; 默认是从Maven的中央库下载 jar文件&#xff0c; 中央库的地址是&#xff1a; https://repo.maven.apache.org/maven2 。 如果下载速度慢&#xff0c; 可以使用阿里的镜像&#xff0c; 地址如下…

[元带你学: eMMC协议详解 16] eMMC 安全方案 之 设备锁定(Lock) / 解锁(Unlock) 详解

依JEDEC eMMC 5.1及经验辛苦整理&#xff0c;付费内容&#xff0c;禁止转载。 所在专栏 《元带你学: eMMC协议详解》 内容摘要 全文 4100 字&#xff0c; 内容摘要 1. 锁定与解锁的概念&#xff1f; 2. 设置密码的方法和注意点&#xff1f; 3. 重置密码的方法和注意点&…

(Linux) WSL 适用于Linux的Windows子系统

文章目录 前言环境设置开发者选项启用或关闭Windows功能进入Microsoft应用商场下载下载完成开启PS: 查看运行效果 Linux基础配置环境缺失注册账号设置root账户密码常用环境的安装 VS Code 连接插件连接的快捷方式 END 前言 学习Linux的阻碍&#xff0c;往往第一步就是没有Linu…

Java实现图片的上传和显示

⭐简单说两句⭐ 作者&#xff1a;后端小知识 CSDN个人主页&#xff1a;后端小知识 &#x1f50e;GZH&#xff1a;后端小知识 &#x1f389;欢迎关注&#x1f50e;点赞&#x1f44d;收藏⭐️留言&#x1f4dd; 文章目录 &#x1f388;前言&#x1f384;前端&#xff1a;&#x1…

ESP32网络应用 -- ESP32-S3使用HTTP协议获取城市天气数据

超文本传输协议(Hypertext Transfer Protocol,HTTP),是一种建立在TCP协议之上,应用非常广泛的请求-响应协议,关于HTTP协议的详细描述,网上已经不乏文章,此处不再详细论述。 作为一款网络功能强大Wi-Fi SOC芯片,ESP32-S3可以通过ESP-IDF编程框架提供的应用程序接口,方…