c语言入门-内存管理函数
目录
memcpy-内存拷贝函数
memmove-内存拷贝
memcmp-内存比较
memset-初始化函数
memcpy-内存拷贝函数
头文件:string.h
函数原型:void *memcpy(void *destin, void *source, unsigned n);
destin-- 指向用于存储复制内容的目标数组,类型强制转换为 void* 指针。
source-- 指向要复制的数据源,类型强制转换为 void* 指针。
n-- 要被复制的字节数。
返回值该函数返回一个指向目标存储区destin的指针。
功能:从源source所指的内存地址的起始位置开始拷贝n个字节到目标destin所指的内存地址的起始位置中。
和strcpy的区别
- 复制的内容不同。strcpy只能复制字符串,而memcpy可以复制任意内容。
- 复制的方法不同。strcpy不需要指定长度,它遇到被复制字符的串结束符"\0"才结束,所以容易溢出。memcpy则是根据其第3个参数决定复制的长度。
#include<stdio.h>
int main()
{int arr[10] = { -1,-2,-3,4,5,6,7,8,9,10 };int brr[3] = { 5,8,10 };memcpy(arr, brr, 12);//拷贝12个字节for (int i = 0; i < 10; i++)printf("%d ", arr[i]);return 0;
}
模拟实现:
#include<stdio.h>
#include<assert.h>
void* my_memcpy(void* arr, const void* brr,size_t m)//m是字符个数
{void* ret = arr;assert(arr && brr);while (m){m--;*((char*)arr) = *((char*)brr);//一个字符的交换arr = (char*)arr + 1;brr = (char*)brr + 1;}return ret;
}
int main()
{int arr[10] = { -1,-2,-3,4,5,6,7,8,9,10 };int brr[3] = { 5,8,10 };my_memcpy(arr, brr, 12);//拷贝12个字节for (int i = 0; i < 10; i++)printf("%d ", arr[i]);return 0;
}
memmove-内存拷贝
功能:memmove用于拷贝字节,如果目标区域和源区域有重叠的话,memmove能够保证源串在被覆盖之前将重叠区域的字节拷贝到目标区域中,但复制后源内容会被更改。但是当目标区域与源区域没有重叠则和memcpy函数功能相同。
模拟实现:
#include<stdio.h>
#include<assert.h>
void* my_memmove(void* dest, const void* str, size_t count)
{assert(dest&&str);void* ret = dest;if (dest < str){while (count--){*(char*)dest = *(char*)str;dest = (char*)dest + 1;str = (char*)str + 1;}}else{while (count--){*((char*)dest + count) = *((char*)str + count);}}return ret;
}
int main()
{int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };my_memmove(arr, arr+2 , 16);for(int i=0;i<10;i++)printf("%d ", arr[i]);return 0;
}
memcmp-内存比较
头文件:#include<string.h>
函数原型:int (const void*dest,const void *str,size_t n)
功能:比较内存区域buf1和buf2的前n个字节
返回值:负数,正数,0
#include<stdio.h>
#include<string.h>
int main()
{int arr[3] = { 1,2,3 };int brr[3] = { 1,2,4 };int ret = memcmp(arr, brr, 8);if (ret < 0)printf("<");else if (ret == 0)printf("=");elseprintf(">");return 0;
}
模拟实现:
#include<stdio.h>
#include<assert.h>
int my_memcmp(const void* dest, const void* str, size_t count)
{assert(dest && str);while (count--){if (*(char*)dest == *(char*)str && *(char*)str!='\0'){dest = (char*)dest + 1;str = (char*)str + 1;}elsebreak;}return *(char*)dest - *(char*)str;
}
int main()
{char arr[3] = { 1,2,3 };char brr[3] = { 1,2,4 };int ret = my_memcmp(arr, brr, 3);if (ret < 0)printf("<");else if (ret == 0)printf("=");elseprintf(">");return 0;
}
memset-初始化函数
头文件:#include<string.h>
函数原型:void *memset(void *s, int ch, size_t n);
函数功能:将s中当前位置后面的n个字节 用 ch 替换并返回 s 。
返回值:指向数组的指针
#include<stdio.h>
#include<string.h>
int main()
{int arr[10]={1,2,3,4,5,6,7,8,9,10};memset(arr, 0, 40);for(int i=0;i<10;i++)printf("%d ", arr[i]);return 0;
}
模拟实现:
#include<stdio.h>
#include<assert.h>
void *my_memset(void* str, int dest, size_t count)
{assert(str);void* ret = str;while (count--){*(char*)str = dest;str = (char*)str + 1;}return str;
}
int main()
{int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };my_memset(arr, 0, 20);for(int i=0;i<10;i++)printf("%d ", arr[i]);return 0;
}
c语言入门-内存管理函数相关推荐
- R语言入门——工作空间管理函数
空间管理函数 00引言 1.正文 1.1主要函数及其功能表 1.2实用小技巧 1.3函数包的整理 1.4对象管理 1.5 帮助文档和式子 1.6保存载入空间的函数 00引言 对于R语言初学者来说,学会 ...
- JVM内存管理------JAVA语言的内存管理概述
转载自 JVM内存管理------JAVA语言的内存管理概述 引言 内存管理一直是JAVA语言自豪与骄傲的资本,它让JAVA程序员基本上可以彻底忽略与内存管理相关的细节,只专注于业务逻辑.不过世界上 ...
- C语言的内存管理(堆,栈,代码段,数据段)
C语言的内存管理(堆,栈,代码段,数据段) 一.几个基本概念 在C语言中,关于内存管理的知识点比较多,如函数.变量.作用域.指针等,在探究C语言内存管理机制时,先简单复习下这几个基本概念: 1.变量: ...
- C语言入门系列 - 自定义函数
C语言入门系列 - 自定义函数 第一节 C 语言基础以及基本数据类型 第二节 C 语言运算符 第三节 C 语言控制语句 第四节 C 语言自定义函数 第五节 C 语言修饰变量的关键字 第六节 C 语言构 ...
- c语言释放内存函数,【C语言】内存分配函数malloc/ calloc/ realloc及内存释放free
前言: 内存区域划分与分配: 1.栈区(stack)--程序运行时由编译器自动分配,存放函数的参数值,局部变量的值等,程序结束时由编译器自动释放. 2.堆区(heap) -- 在内存开辟另一块存储区域 ...
- C语言动态内存管理和动态内存分配函数
给变量分配内存空间可分为静态内存分配和动态内存分配. 静态内存分配属于编译时给变量分配的空间,动态分配属于在程序运行时给变量分配的空间 静态分配属于栈分配,动态分配属于堆分配 运行效率上,静态内存比动 ...
- 嵌入式C语言基础知识查漏补缺--内存管理函数指针数组
内存管理: 堆和栈的理解和区别 局部变量 静态局部变量 全局变量 静态全局变量 作用域 在定义变量的{}之内有效 在定义变量的{}之内有效 整个工程,所有文件 当前文件 生命周期 程序运行至变量定义处 ...
- 【C 语言】内存管理 ( 动态内存分配 | 栈 | 堆 | 静态存储区 | 内存布局 | 野指针 )
相关文章链接 : 1.[嵌入式开发]C语言 指针数组 多维数组 2.[嵌入式开发]C语言 命令行参数 函数指针 gdb调试 3.[嵌入式开发]C语言 结构体相关 的 函数 指针 数组 4.[嵌入式开发 ...
- C语言 --- 动态内存管理(上)+优化版通讯录+笔试题
文章目录 前言 一.为什么存在动态内存分配 二.动态内存函数的介绍 2.1.malloc函数+free函数 2.2.calloc函数+free函数 2.3.realloc函数 三.常见的动态内存错误 ...
最新文章
- 对象存储使用案例_杉岩MOS海量对象存储中标福建移动
- php导出照片,TP5导出excel图片和数据--先下载图片到本地服务器
- 关于unix下使用tar的一些常用技巧
- 《西线无战事》:合上书的那一刻:只想痛哭
- MFC空间几何变换之图像平移、镜像、旋转、缩放
- 利用layui来完成垂直和侧边导航的小案例
- Windows安装pytorch-gpu
- 件测试专家分享III GUI自动化测试相关
- Idea 添加lib文件夹,并添加至项目Libary
- InnoDB 行格式
- 自然语言处理——分词算法
- 产品思维训练 | 常见的用户增长手段有哪些?
- 初始化云硬盘切换云主机挂载验证lvm跨主机可读
- 编译原理(三)语法分析:3.二义性与二义性的消除
- 无人驾驶汽车系统入门(二)——高级运动模型和扩展卡尔曼滤波
- 首台微型计算机,全球首台骁龙820微型电脑:DragonBoard 820c
- vivado 2021.2下载安装兼容的matlab
- c语言中程序框图含义,关于高中数学《算法的含义、程序框图 》练习题
- 初学opencv 2
- 国外常用的软件测试网站
热门文章
- 苹果手机不实用?那你是没用过这4个功能,快捷又方便
- 这5个编程名言还请您收好
- 关于ComboBox
- 百度地图基础应用教程
- 游戏计算机配置标准,想确定自你的电脑配置是否达到某个游戏的最低配置标准的人请进...
- iOS 5.1 不完美越狱工具发布
- CSS两个div并排
- 三星n7100刷机步骤
- 自助建站做站都有哪些步骤。
- inaflash什么意思中文_flash是什么意思_flash的翻译_音标_读音_用法_例句_爱词霸在线词典...