肖恩带你看C语言内存函数~

1. memcpy使用和模拟实现

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

• 函数memcpy从source的位置开始向后复制num个字节的数据到destination指向的内存位置。
• 这个函数在遇到 ‘\0’ 的时候并不会停下来。
• 如果source和destination有任何的重叠,复制的结果都是未定义的。
(对于重叠的内存,交给第二个函数memmove来处理。)
eg:

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

在这里插入图片描述
memcpy函数的模拟实现:

void * my_memcpy ( void * dst, const void * src, size_t count)
{
 void * ret = dst;
 assert(dst);
 assert(src);
 while (count--) {
 *(char *)dst = *(char *)src;
 dst = (char *)dst + 1;
 src = (char *)src + 1;
 }
 return(ret);
}
  1. 首先将目标内存区域的起始地址赋值给指针变量ret,以备最后返回。

  2. 然后通过assert函数来检查目标内存区域和源内存区域的地址是否有效,如果地址无效,则程序会终止。

  3. 进入while循环,每次循环会将源内存区域的一个字节数据复制到目标内存区域中。

  4. 在循环中,将源内存区域和目标内存区域的指针分别转换为(char *)类型,以便逐字节复制数据。

  5. 每次循环完成后,将目标内存区域和源内存区域的指针分别后移一个字节,以便进行下一次数据复制。

  6. 当count减为0时,表示所有数据已经复制完成,函数返回最初的目标内存区域起始地址ret。

2. memmove使用和模拟实现

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

• 和memcpy的差别就是memmove函数处理的源内存块和⽬标内存块是可以重叠的。
eg:

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

那结果自然就是:1 2 1 2 3 4 5 8 9 10
memmove的模拟实现:
这个就有点小复杂咯

void * my_memmove ( void * dst, const void * src, size_t count)
{
 void * ret = dst;
 if (dst <= src || (char *)dst >= ((char *)src + count)) {
 while (count--) {
 *(char *)dst = *(char *)src;
 dst = (char *)dst + 1;
 src = (char *)src + 1;
 }
 }
 else {

 dst = (char *)dst + count - 1;
 src = (char *)src + count - 1;
 while (count--) {
 *(char *)dst = *(char *)src;
 dst = (char *)dst - 1;
 src = (char *)src - 1;
 }
 }
 return(ret);
}
  1. 首先将目标内存区域的起始地址赋值给指针变量ret,以备最后返回。
  2. 接着通过判断源内存区域和目标内存区域的相对位置,来确定移动方式:
    如果目标内存区域的起始地址小于等于源内存区域的起始地址,或者目标内存区域的结束地址大于等于源内存区域的结束地址,则采用正向移动方式。
    否则,采用反向移动方式。
  3. 对于正向移动方式,通过while循环逐个字节地将源内存区域的数据复制到目标内存区域中,并且每次循环后将指针向后移动一个字节。
  4. 对于反向移动方式,先将目标内存区域和源内存区域的指针移动到最后一个字节的位置,然后通过while循环逐个字节地将源内存区域的数据复制到目标内存区域中,并且每次循环后将指针向前移动一个字节。
  5. 当所有数据移动完成后,函数返回最初的目标内存区域起始地址ret。

3. memset函数的使用

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

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

#include <stdio.h>
#include <string.h>
int main ()
{
 char str[] = "hello world";
 memset (str,'x',6);
 printf(str);
 return 0;
}

结果:
xxxxxxworld

4. memcmp函数的使用

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

• 比较从ptr1和ptr2指针指向的位置开始,向后的num个字节
比较两个内存块。它比较ptr1和ptr2指向的内存区域的前n个字节。函数返回一个整数,如果ptr1的前n个字节小于、等于或大于ptr2的前n个字节,则分别返回小于零、等于零或大于零。

#include <stdio.h>
#include <string.h>
int main()
{
 char buffer1[] = "DWgaOtP12df0";
 char buffer2[] = "DWGAOTP12DF0";
 int n;
 n = memcmp(buffer1, buffer2, sizeof(buffer1));
 if (n > 0) 
 printf("'%s' is greater than '%s'.\n", buffer1, buffer2);
 else if (n < 0) 
 printf("'%s' is less than '%s'.\n", buffer1, buffer2);
 else
 printf("'%s' is the same as '%s'.\n", buffer1, buffer2);
 return 0;
}

‘DWgaOtP12df0’ is greater than ‘DWGAOTP12DF0’.
那么本期文章就到这里,感谢大家的观看,我们下期再见咯
在这里插入图片描述
下期预告
······结构体

  • 14
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
森林防火应急联动指挥系统是一个集成了北斗定位/GPS、GIS、RS遥感、无线网络通讯、4G网络等技术的现代化智能系统,旨在提高森林火灾的预防和扑救效率。该系统通过实时监控、地图服务、历史数据管理、调度语音等功能,实现了现场指挥调度、语音呼叫通讯、远程监控、现场直播、救火人员生命检测等工作的网络化、智能化、可视化。它能够在火灾发生后迅速组网,确保现场与指挥中心的通信畅通,同时,系统支持快速部署,适应各种极端环境,保障信息的实时传输和历史数据的安全存储。 系统的设计遵循先进性、实用性、标准性、开放性、安全性、可靠性和扩展性原则,确保了技术的领先地位和未来的发展空间。系统架构包括应急终端、无线专网、应用联动应用和服务组件,以及安全审计模块,以确保用户合法性和数据安全性。部署方案灵活,能够根据现场需求快速搭建应急指挥平台,支持高并发视频直播和大容量数据存储。 智能终端设备具备三防等级,能够在恶劣环境下稳定工作,支持北斗+GPS双模定位,提供精确的位置信息。设备搭载的操作系统和处理器能够处理复杂的任务,如高清视频拍摄和数据传输。此外,设备还配备了多种传感器和接口,以适应不同的使用场景。 自适应无线网络是系统的关键组成部分,它基于认知无线电技术,能够根据环境变化动态调整通讯参数,优化通讯效果。网络支持点对点和点对多点的组网模式,具有低功耗、长距离覆盖、强抗干扰能力等特点,易于部署和维护。 系统的售后服务保障包括安装实施服务、系统维护服务、系统完善服务、培训服务等,确保用户能够高效使用系统。提供7*24小时的实时故障响应,以及定期的系统优化和维护,确保系统的稳定运行。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值