完全自学C(干货) —— 内存操作函数

告别抓包失败!保姆级配置:让Burp+Proxifier稳定抓取任意微信小程序 本文提供了一套完整的Burp+Proxifier配置方案,确保稳定抓取微信小程序数据。从环境准备、工具选型到Burp Suite深度配置和Proxifier精准设置,详细解决了证书安装、进程捕获和乱码解析等核心问题,帮助开发者告别抓包失败,提升调试效率。 阅读详情

目录

memcpy

memmove

memcmp

memset


内存操作函数

  • memcpy
  • memmove
  • memset
  • memcmp

memcpy

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

  • 复制指定个数字节数据,到目标位置;
    • 遇到'\0'并不会停下来;
    • 如source和destination有任何的重叠也可使用,但一般使用memmove;

注:模拟实现的函数,无法自己拷贝重叠,会覆盖数据;

#include <stdio.h>
#include <string.h>
int main()
{
	int arr1[10] = { 0 };
	int arr2[10] = { 0,1,2,3,4,5,6,7,8,9 };
	//将arr2数组中,前20个字节数据复制到arr1中
	memcpy(arr1, arr2, 5 * 4);
	return 0;
}
#include <stdio.h>
#include <string.h>
#include <assert.h>
//模拟实现memcpy
void* my_memcpy(void* dest, const void* src, size_t num)
{
	assert(dest);
	assert(src);
	void* tmp = dest;
	while (num--)
	{
		*((char*)dest)++ = *((char*)src)++;
	}
	return tmp;
}

int main()
{
	char str1[] = "abcdefg";
	char str2[] = "qwe";
	printf("%s ", (char*)my_memcpy(str1, str2, 3));
	return 0;
}
int main()
{
    //会出现覆盖错误
	char str1[] = "abcdefg";
	printf("%s ", (char*)my_memcpy(str1+2, str1, 3));
	return 0;
}
//结果:abafg

int main()
{
	char str1[] = "abcdefg";
	printf("%s ", (char*)memcpy(str1 + 2, str1, 3));
	return 0;
}
//结果:abcfg

memmove

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

  • 复制指定个数字节数据,到目标位置;
    • 与memcpy的差别,处理的源内存块和目标内存块是可以重叠的;
    • 源空间和目标空间出现重叠,使用memmove函数;
#include <stdio.h>
#include <string.h>
#include <assert.h>
//模拟实现memmove
void* my_memmove(void* dest, const void* src, size_t num)
{
	assert(dest);
	assert(src);
	void* tmp = dest;
	//dest<src(dest在前),从前向后拷贝
	if (dest < src)
	{
		while (num--)
		{
			*((char*)dest)++ = *((char*)src)++;
		}
	}
	//dest>=src(dest在后),从后向前拷贝
	else
	{
		while (num--)
		{
			*((char*)dest + num) = *((char*)src + num);
		}
	}
	return tmp;
}

int main()
{
	char str1[] = "abcdefg";
	char str2[] = "qwe";
	printf("%s ", (char*)my_memmove(str1+2, str1, 3));
	return 0;
}
//结果:abcfg

memcmp

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

  • 比较从ptr1和ptr2指针开始的每个字节无符号值大小,总共比较num个数;
    • <0,ptr1代码块内容小于ptr2代码块内容;
    • =0,ptr1代码块内容等于ptr2代码块内容;
    • >0,ptr1代码块内容大于ptr2代码块内容;

注:和'\0'无关,注意和strcmp/strncmp区分;

#include <stdio.h>
#include <string.h>
#include <assert.h>
//模拟实现memcmp,参考strncmp
int my_memcmp(const void* p1, const void* p2, size_t num)
{
	assert(p1);
	assert(p2);
	if (!num)
		return 0;
	while (num--)
	{
		if (*(char*)p1 != *(char*)p2)
		{
			//比较字节无符号值大小
			//大于返回1,小于返回-1
			return (*(unsigned char*)p1 > *(unsigned char*)p2) - (*(unsigned char*)p1 < *(unsigned char*)p2);
		}
		((char*)p1)++;
		((char*)p2)++;
	}
	return 0;
}

int main()
{
	int arr1[] = { 1,222,3,4 };
	int arr2[] = { 1,333 };
	printf("%d ", memcmp(arr1, arr2, 2*4)); //以每个字节值进行比较,num不要越界
	printf("%d ", my_memcmp(arr1, arr2, 2 * 4));
	return 0;
}
//结果:1 1

memset

void* memset(void* destination,int c, size_t num)

  • 设置num字节,每个字节值为c;
    • 将目标地址内num个内存,值设置为c,返回目标空间地址;
    • c为待设置的内存字节值,num指定字节个数;
int main()
{
	char str1[] = "abcdefg";
	printf("%s ", (char*)memset(str1, 'q', 3)); //以每个字节进行设置的
	return 0;
}
//结果:qqqdefg
#include <stdio.h>
#include <string.h>
#include <assert.h>
//模拟实现memset
void* my_memset(void* dest, int c, size_t num)
{
	assert(dest);
	void* tmp = dest;
	while (num--)
	{
		*(char*)dest = c;
		(char*)dest += 1;
	}
	return tmp;
}

int main()
{
	char str[] = "abcdefg";
	printf("%s ", (char*)my_memset(str, 'q', 3));
	return 0;
}
//结果:qqqdefg

共模电感在EMI滤波中的实战应用与设计技巧 本文深入探讨了共模电感在EMI滤波中的关键作用与设计技巧,涵盖电感值选择、饱和电流风险、磁芯材料性能及绕组工艺等实战经验。通过具体案例解析,展示了共模电感在开关电源、高速接口及汽车电子中的高效应用,帮助工程师解决电磁兼容问题并提升信号完整性。 阅读详情

相关推荐

基于EKF的UWB-IMU融合定位系统在农业机器人中的抗干扰优化与Matlab仿真

本文探讨了基于扩展卡尔曼滤波(EKF)的UWB-IMU传感器融合定位系统在农业机器人中的应用。通过Matlab仿真验证,该系统有效解决了农业环境中UWB信号遮挡和IMU累积误差问题,实现了厘米级高精度定位,显著提升了机器人在复杂场景下的抗干扰能力和导航可靠性。

numpy6sculptor的博客 622

完全自学C(干货) —— 函数

即子程序,是大型程序中某部分代码,由一个或多个语句块组成,通常被集成为软件库;

NapoleonCoder的博客 380

相机中的归一化实现讲解

本分讲解了图像处理中常出现的两个相机归一化操作

weixin_42102084的博客 1474

完全自学C(干货) —— 动态内存管理

对事先不确定的内存大小可使用动态内存函数;

NapoleonCoder的博客 392

MIPI DPHY接口(基于Xilinx FPGA实现)案例分析

在Xilinx FPGA实现MIPI DPHY接口的案例(包括CIS协议层)。截止目前为止,Xilinx仅在Ultrascale+及其以上版本的FPGA IO可直接支持MIPI 电平输入,其他的,都需要转换成LVDS来接收。

ONEFPGA的博客 5625

fpga学习——zynq图像处理中的DVP流接口封装

之前文章介绍了基于zynq的图像处理架构问题。其中,作为开发者,需要重点关注图像传感器接口、处理算法、显示接口,这些模块。现在我们一同学习用于视频数据接口的DVP模块,并将其封装成AXI-stream接口便于直接和VDMA IP通信。 DVP_AXI stream IP v1.0使用说明 1.设计概述 •用于cmos传感器视频数据采集,将cmos输出的8位视频数据拼接成RGB 565模式 •AXI_stream主机接口,用于和PS端内存的数据交互 •基于vivado 18.3软件设计 2.模块分析

weixin_41895751的博客 4582

完全自学C(干货) —— 编译与链接

编译与链接,预处理指令;

NapoleonCoder的博客 1203

YOLOv11的对比学习预训练改进-(通过SimCLR预训练增强特征提取)

本文介绍了将SimCLR对比学习预训练与YOLOv11目标检测模型相结合的创新方法。文章首先概述了目标检测领域的发展现状和YOLOv11的架构优化,包括主干网络、特征金字塔和检测头的改进设计。其次详细解析了SimCLR对比学习的核心原理,涵盖数据增强、投影头设计和NT-Xent损失函数。最后探讨了如何将对比学习与目标检测有效结合,通过特征空间对齐和渐进式微调策略提升模型性能。该方法显著增强了特征提取能力,提高了检测精度和训练效率,特别是在小目标和遮挡目标的检测上表现突出。

本博客聚焦 YOLOv11 全流程落地,涵盖架构优化、数据集处理、训练技巧与多场景部署,兼及国产数据库、Java 开发与 AI 模型应用,内容兼顾理论与工程实践,为开发者提供系统干货,助力高效提升技术能力。 685

完全自学C(干货) —— 操作符(一)

操作符

NapoleonCoder的博客 322

无线通信基础:调制与解调技术_(42).7.3.2多进制频移键控解调(MFSK解调)

MFSK解调是一种通过频谱分析和频率检测来恢复数字信号的技术。本文介绍了MFSK解调的基本原理,包括信号接收、频谱分析、频率检测和符号判决。在实际应用中,噪声会对解调性能产生影响,因此引入了信噪比优化和多步判决方法来提高解调的准确性。通过性能评估,可以更好地理解MFSK解调在不同噪声环境下的表现。这些方法和技术为MFSK在实际通信系统中的应用提供了理论和实践基础。

2401_87715305的博客 1316

华为 MetaERP 总账模块依托 “交易即核算” 的事件驱动架构,与 Oracle EBS 相比,更强调业务事件自动触发财务动作、实时数据同步和智能规则引擎,实现业务与财务的深度融合

华为MetaERP总账模块采用"交易即核算"架构,相比Oracle EBS实现了三大突破:1)业务事件自动触发财务动作,如采购收货自动生成暂估凭证;2)业务财务数据实时同步,支持即时分析;3)内置智能规则引擎,实现自动匹配、核销和结转。该模块覆盖采购、销售、资产、薪酬等全业务场景,支持多维核算和关联交易自动抵消,显著提升核算效率与准确性。其中采购暂估、销售结转等场景实现全自动化处理,较EBS减少80%手工操作。

金牌架构师 222

想自学写个操作系统,有哪些推荐看的书籍?

哈喽,我是子牙,一个很卷的硬核男人。喜欢研究底层,聚焦做那些大家想学没地方学的课程:手写操作系统、手写虚拟机、手写编程语言…今天我们将站在一个自学者的角度来聊聊如何实现自己的操作系统。并为大家推荐几本能够帮助你巩固知识,修炼内功的书籍,这些书籍涵盖了操作系统的核心概念、设计原理和实践技巧。如果你能够啃得下来,对于你的技术提升绝对是一个质的飞跃。同时我也为大家整理好了这些电子书的下载地址,以及开发操作系统的环境搭建打包文件,都一同贴在了文章末尾,希望能够帮助到梦想实现自己操作系统的技术人。

子牙老师 1万+

射频仿真软件:ADS (Advanced Design System)_(29).ADS脚本编程与自动化

ADS脚本编程为射频设计提供了强大的自动化工具,可以帮助用户实现设计流程的优化、参数扫描和优化、结果分析和报告生成等任务。选择合适的脚本语言(Python、Tcl、AEL)并合理设置ADS环境,可以显著提高设计效率和准确性。通过实际项目中的应用案例,我们可以更好地理解如何利用脚本编程解决复杂的射频设计问题。希望本文对您的ADS脚本编程学习有所帮助。

kkchenjj的博客 2470

完全自学C(干货) —— 指针进阶

字符指针; 数组指针/指针数组; 数组传参/指针传参; 函数指针/函数指针数组; 指向函数指针数组的指针; 回调函数

NapoleonCoder的博客 330

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

完全自学C(干货) —— 数组

一组相同类型元素的集合,可存储一系列相同类型的数据;

NapoleonCoder的博客 1153

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

完全自学C(干货) —— 数据的存储

原反补码,(-1)^S * M * 2^E;

NapoleonCoder的博客 376

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

C语言字符函数和字符串函数及内存函数详解(干货小知识:常用函数的模拟实现)(1)

其实在前面已经说过了,strlen返回值类型是size_t,是无符号整型,两个无符号整型相减得出来的值如果是负数会进行变量提升为正数,所以上述运行结果会出现:3-6=3的情况。在编程中,我们经常要处理一些字符和字符串,为了更好的操作字符和字符串,在C语言标准库中提供了一系列的库函数,接下来介绍一些常见的字符和字符串库函数。还是拿大写字母转小写字母举例,上述代码是使用+32实现的结果,现如今有了转换函数,就可以直接使用。C语言中有专门用来做字符分类的函数,表明一个字符是属于什么类型的。

2401_84166794的博客 1227

完全自学C(干货) —— 文件

文件名/文件指针/文件的打开和关闭/文件的顺序读写/文件的随机读写/文本文件和二进制文件/文件的结束判定/文件缓冲区;

NapoleonCoder的博客 543

完全自学C(干货) —— 调试

Debug,又称除错,即发现和减少程序错误的过程;

NapoleonCoder的博客 218

完全自学C(干货) —— 指针初识

指针即内存地址(编号);

NapoleonCoder的博客 356

完全自学C(干货) —— 操作符(二)

操作符的优先级和结合性,整型提升、算术转换;

NapoleonCoder的博客 348

完全自学C(干货) —— 结构体初识

是一些值的集合,这些值被称为成员变量;

NapoleonCoder的博客 344

完全自学C(干货) —— 自定义类型

结构体是一些值的集合,称为成员变量;内存对齐;段位;

NapoleonCoder的博客 389

0基础C语言自学教程——第十三节 文件操作

1、为什么使用文件 2、什么是文件 2-1 程序文件 2-2 数据文件 2-3 文件名 3、文件的打开和关闭 3-1 文件指针 ​4、文件的打开和关闭函数 4-1 fputc函数 4-2 fgetc函数 4-3 fgets和fputs函数 ​3-4 fprintf函数和fscanf函数 3-5 sprintf函数和sscanf函数 ​ 3-6 fread和fwrite函数 4、文件的随机读写 4-1 fseek函数 4-2 ftell函数 4-3 rewind函数

jxwd的博客 1004

0基础C语言自学保姆教程——第十二节 动态内存分配

0、动态内存分配的意义与存在背景 1、动态内存开辟函数介绍 1-1 malloc和free 1-2 calloc 1-3 realloc 2、常见的动态内存开辟错误分析 2-1 对NULL指针的解引用操作 2-2 对动态开辟空间的越界访问 2-3free函数使用不当 2-3-1 free函数释放不是动态开辟的内存 2-3-2 free不完全 2-3-3 忘记free 3、补充:C/C++程序的内存开辟(重要) 4、柔性数组

jxwd的博客 465

0基础C保姆自学 第二节——初步认识C语言的全部知识框架

在看本章节前,请确保已经掌握了第一节的内容呦。不懂的欢迎在评论区留言~~~~ 本节定位:初步了解认识一下C中的知识,所有的知识都是点到为止。目的是在接下来章节的介绍中笔者的举例读者可以更好的接受。比如在函数的介绍中我们会用到指针。 所有的知识点我们会在接下来的章节一一详细介绍,读者在阅读本章的时候,只需要知道有这么个东西,并且能够理解笔者所说的含义即可。 本节我们将沿着上一节介绍: 本节内容有: 数据类型; 常量和变量; 字符串; 转义字符; 代码注释; 数组; 函数; 选择语句;

jxwd的博客 1万+
上一篇: 完全自学C(干货) —— 字符(串)函数
下一篇: 完全自学C(干货) —— 自定义类型
挨代码
博客等级 码龄5年 1696粉丝 384原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值