目录

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语言入门-内存管理函数相关推荐

  1. R语言入门——工作空间管理函数

    空间管理函数 00引言 1.正文 1.1主要函数及其功能表 1.2实用小技巧 1.3函数包的整理 1.4对象管理 1.5 帮助文档和式子 1.6保存载入空间的函数 00引言 对于R语言初学者来说,学会 ...

  2. JVM内存管理------JAVA语言的内存管理概述

    转载自  JVM内存管理------JAVA语言的内存管理概述 引言 内存管理一直是JAVA语言自豪与骄傲的资本,它让JAVA程序员基本上可以彻底忽略与内存管理相关的细节,只专注于业务逻辑.不过世界上 ...

  3. C语言的内存管理(堆,栈,代码段,数据段)

    C语言的内存管理(堆,栈,代码段,数据段) 一.几个基本概念 在C语言中,关于内存管理的知识点比较多,如函数.变量.作用域.指针等,在探究C语言内存管理机制时,先简单复习下这几个基本概念: 1.变量: ...

  4. C语言入门系列 - 自定义函数

    C语言入门系列 - 自定义函数 第一节 C 语言基础以及基本数据类型 第二节 C 语言运算符 第三节 C 语言控制语句 第四节 C 语言自定义函数 第五节 C 语言修饰变量的关键字 第六节 C 语言构 ...

  5. c语言释放内存函数,【C语言】内存分配函数malloc/ calloc/ realloc及内存释放free

    前言: 内存区域划分与分配: 1.栈区(stack)--程序运行时由编译器自动分配,存放函数的参数值,局部变量的值等,程序结束时由编译器自动释放. 2.堆区(heap) -- 在内存开辟另一块存储区域 ...

  6. C语言动态内存管理和动态内存分配函数

    给变量分配内存空间可分为静态内存分配和动态内存分配. 静态内存分配属于编译时给变量分配的空间,动态分配属于在程序运行时给变量分配的空间 静态分配属于栈分配,动态分配属于堆分配 运行效率上,静态内存比动 ...

  7. 嵌入式C语言基础知识查漏补缺--内存管理函数指针数组

    内存管理: 堆和栈的理解和区别 局部变量 静态局部变量 全局变量 静态全局变量 作用域 在定义变量的{}之内有效 在定义变量的{}之内有效 整个工程,所有文件 当前文件 生命周期 程序运行至变量定义处 ...

  8. 【C 语言】内存管理 ( 动态内存分配 | 栈 | 堆 | 静态存储区 | 内存布局 | 野指针 )

    相关文章链接 : 1.[嵌入式开发]C语言 指针数组 多维数组 2.[嵌入式开发]C语言 命令行参数 函数指针 gdb调试 3.[嵌入式开发]C语言 结构体相关 的 函数 指针 数组 4.[嵌入式开发 ...

  9. C语言 --- 动态内存管理(上)+优化版通讯录+笔试题

    文章目录 前言 一.为什么存在动态内存分配 二.动态内存函数的介绍 2.1.malloc函数+free函数 2.2.calloc函数+free函数 2.3.realloc函数 三.常见的动态内存错误 ...

最新文章

  1. 对象存储使用案例_杉岩MOS海量对象存储中标福建移动
  2. php导出照片,TP5导出excel图片和数据--先下载图片到本地服务器
  3. 关于unix下使用tar的一些常用技巧
  4. 《西线无战事》:合上书的那一刻:只想痛哭
  5. MFC空间几何变换之图像平移、镜像、旋转、缩放
  6. 利用layui来完成垂直和侧边导航的小案例
  7. Windows安装pytorch-gpu
  8. 件测试专家分享III GUI自动化测试相关
  9. Idea 添加lib文件夹,并添加至项目Libary
  10. InnoDB 行格式
  11. 自然语言处理——分词算法
  12. 产品思维训练 | 常见的用户增长手段有哪些?
  13. 初始化云硬盘切换云主机挂载验证lvm跨主机可读
  14. 编译原理(三)语法分析:3.二义性与二义性的消除
  15. 无人驾驶汽车系统入门(二)——高级运动模型和扩展卡尔曼滤波
  16. 首台微型计算机,全球首台骁龙820微型电脑:DragonBoard 820c
  17. vivado 2021.2下载安装兼容的matlab
  18. c语言中程序框图含义,关于高中数学《算法的含义、程序框图 》练习题
  19. 初学opencv 2
  20. 国外常用的软件测试网站

热门文章

  1. 苹果手机不实用?那你是没用过这4个功能,快捷又方便
  2. 这5个编程名言还请您收好
  3. 关于ComboBox
  4. 百度地图基础应用教程
  5. 游戏计算机配置标准,想确定自你的电脑配置是否达到某个游戏的最低配置标准的人请进...
  6. iOS 5.1 不完美越狱工具发布
  7. CSS两个div并排
  8. 三星n7100刷机步骤
  9. 自助建站做站都有哪些步骤。
  10. inaflash什么意思中文_flash是什么意思_flash的翻译_音标_读音_用法_例句_爱词霸在线词典...