当前位置: 首页 > news >正文

C语言学习之内存函数

        今天我们来学习一下C语言中内存函数

        以下内存函数的使用均需要包含头文件<string.h>

目录

memcpy函数的使用及其模拟实现

        memcpy函数的模拟实现

memmove函数的使用和模拟实现

        memmove函数的模拟实现

memset函数的使用

memcmp函数的使用


memcpy函数的使用及其模拟实现

        语法结构如下:

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

        memcpy函数从source位置开始向后复制num个字节的数据到destination指向的内存位置

        这个函数在遇到’\0‘的时候不会停下来

        如果source和 destination重叠复制的结果都未知

#include<stdio.h>
#include<string.h>
int main()
{int ar1[] = { 1,2,3,4,5,6,7,8,9,10 };int ar2[10] = {0};memcpy(ar2, ar1,sizeof(ar1));for (int i = 0;i < 10;i++){printf("%d ", ar2[i]);}return 0;
}

        memcpy函数的模拟实现

#include<stdio.h>
#include<string.h>
//函数返回目标空间的起始地址
void my_memcpy(void* dest, const void* src, size_t num)
{//void*指针需要转换,不能直接运算while (num--){*(char*)dest = *(char*)src;src = (char*)src + 1;dest = (char*)dest + 1;}}
int main()
{int ar1[10] = { 1,2,3,4,5,6,7,8,9,10 };int ar2[10] = {0};my_memcpy(ar2, ar1,sizeof(ar1));for (int i = 0;i < 10;i++){printf("%d ", ar2[i]);}return 0;
}

而对于重叠的内存空间,可以交给memmove函数处理

memmove函数的使用和模拟实现

        语法结构:

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

        与memmove函数差别是memmove函数处理的源内存块和目标内存块是可以重叠的 

        如果源内存和目标空间出现重叠,就交给memmove函数处理

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

        结果为:

        memmove函数的模拟实现

        思路:以拷贝5个字节到第三个为起始位置为例:

        

        当将蓝色数据拷贝到红色数据的时候,从后向前;将红色数据拷贝到蓝色数据的时候,从前向后

        因此有如下代码: 

void* my_memmove(void* dest, const void* src, size_t num)
{void* ret = dest;if (dest<src || (char*)dest>(char*)src + num){/*源头在目标前面,或目标在源头后面,则从头开始复制*/while (num--){*(char*)dest = *(char*)src;src = (char*)src + 1;dest = (char*)dest + 1;}}else{/*源头在目标后面,则从尾开始复制*/dest = (char*)dest + num - 1;src = (char*)src + num - 1;while (num--){*(char*)dest = *(char*)src;src = (char*)src - 1;dest = (char*)dest - 1;}}return (ret);
}
int main()
{int ar1[] = { 1,2,3,4,5,6,7,8,9,10 };my_memmove(ar1, ar1+2,20);for (int i = 0;i < 10;i++){printf("%d ", ar1[i]);}return 0;
}

memset函数的使用

        语法结构:

void* memset(void* ptr, int value, size_t num);

        memset函数是用来设置内存的,将内存中的值以字节为单位设置成想要的内容

#include<stdio.h>
#include<string.h>
int main()
{char str1[] = "hello world";memset(str1, 'a', 6);printf("%s\n", str1);return 0;
}

       结果为:

         

memcmp函数的使用

        语法结构为:

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

        比较ptr1和ptr2指针指向的位置,向后num个字节(即比较前num个字节的大小)

        返回值如下:

         即:

        <0,ptr1小于ptr2

        =0,ptr1等于ptr2

        >0,ptr1大于ptr2

#include<stdio.h>
#include<string.h>
int main()
{char str1[] = "DWAGYftsuibhug";char str2[] = "DWAGYhulu";int n=memcmp(str1, str2, sizeof(char)*10);if (n == 0){printf("str1 is equal to str2\n");}else if (n < 0){printf("str1 is less than str2\n");}else{printf("str1 is greater than str2\n");}my_memcpy(str1, str2, sizeof(char)*5);return 0;
}

        本篇博客就到这里了。求一个点赞,谢谢各位

http://www.xdnf.cn/news/558775.html

相关文章:

  • AI练习:毛发旋转效果
  • 再议AOI算法
  • 通过强化学习让大模型自适应开启思考模式
  • 101个α因子#9
  • C++(3)
  • idea如何让文件夹分层显示,而不是圆点分割
  • Python训练营打卡 Day31
  • 模板引擎:FreeMarker
  • 基于pyttsx3的文字转语音实现
  • 输出字母在字符串中位置索引
  • 超强吸水宠物垫行业2025数据分析报告
  • 从计算机组成原理寻址方式参悟指针的本质
  • cpu的x86架构跟ARM架构的区别介绍
  • SpringBoot整合LangChain4J
  • 深入探讨 Java 中的函数式编程
  • 9-社区动态(Stack布局)
  • 探秘大数据架构:解锁高效数据处理的密码
  • SpringBoot3+Vue3(1)-后端 请求头校验,jwt退出登录,mybaits实现数据库用户校验
  • 拦截指定注解(FeignClient),补偿重试
  • java异常处理
  • 7-Zip软件下载与使用攻略:如何使用7z格式解压缩更高效?
  • MySQL 8.0 OCP 1Z0-908 题目解析(9)
  • Redis--Redis命令详解
  • linux安装JDK8
  • Python Day27 学习
  • leetcode 33. Search in Rotated Sorted Array
  • vue图片懒加载指令实现
  • 指针深入理解(二)
  • 在表格中使用AI解析通信协议
  • Vue3 父子组件传值, 跨组件传值,传函数