C进阶_内存库函数

news/2025/1/15 21:47:04/

目录

memcpy

模拟实现memcpy

memmove

模拟实现memmove

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>
struct
{char name[40];int age;
} person, person_copy;
int main()
{char myname[] = "Pierre de Fermat";//用memcpy拷贝字符串memcpy(person.name, myname, strlen(myname) + 1);person.age = 46;//用memcpy拷贝结构体memcpy(&person_copy, &person, sizeof(person));printf("person_copy: %s, %d \n", person_copy.name, person_copy.age);return 0;
}

输出结果为:

模拟实现memcpy

void* 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);
}

memmove

memmove的函数原型是:

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

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

如果源空间和目标空间出现重叠,就得使用memmove函数处理。

例子:

#include <stdio.h>
#include <string.h>
int main()
{char str[] = "memmove can be very useful......";memmove(str + 20, str + 15, 11);puts(str);return 0;
}

输出结果为:

模拟实现memmove


void* memmove(void* dst, const void* src, size_t count)
{void* ret = dst;if (dst <= src || (char*)dst >= ((char*)src + count)) {/** Non-Overlapping Buffers* copy from lower addresses to higher addresses
*/while (count--) {*(char*)dst = *(char*)src;dst = (char*)dst + 1;src = (char*)src + 1;}}else {/** Overlapping Buffers* copy from higher addresses to lower addresses*/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);
}

memcmp

它的函数原型为:

int memcmp( const void *buf1, const void *buf2, size_t count );

作用是比较从ptr1和ptr2指针开始的num个字节。

查找它的文档:

Return Value

The return value indicates the relationship between the buffers.

Return ValueRelationship of First count Bytes of buf1 and buf2
< 0buf1 less than buf2
0buf1 identical to buf2
> 0buf1 greater than buf2

由此可知buf1小于buf2时返回值小于0,buf1等于buf2时返回值为0,buf1大于buf2时返回值大于0。

例子:

void* 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);
}


http://www.ppmy.cn/news/12876.html

相关文章

【树莓派4B】搭建HomeAssistant服务端(二)(systemd配置开机自启动,cpolar内网穿透)

设置开机自启动 创建home-assistanthomeassistant.service服务&#xff1a; sudo nano /etc/systemd/system/home-assistanthomeassistant.service复制以下内容&#xff0c;定义服务&#xff0c;其中After定义先行服务&#xff0c;ExecStart执行启动脚本&#xff1a; [Unit]…

HTB打靶(Active Directory 101 Resolute)

nmap扫描 nmap -A -T4 10.10.10.169 Starting Nmap 7.93 ( https://nmap.org ) at 2023-01-16 01:30 EST Stats: 0:00:04 elapsed; 0 hosts completed (1 up), 1 undergoing SYN Stealth Scan SYN Stealth Scan Timing: About 74.65% done; ETC: 01:30 (0:00:01 remaining) St…

Linux三剑客之Sed

目录 一、认识sed 二、使用sed 命令格式 常用选项options 地址定界 编辑命令command sed用法 常用选项&#xff1a; 地址界定演示 编辑命令command演示 sed高级编辑命令 一、认识sed sed 是一种流编辑器&#xff0c;它一次处理一行内容。处理时&#xff0c;把当前处理的行…

ConcurrentHashMap 的优化及其与HashTable, HashMap的区别

目录 1.优化一:减小锁粒度 2.优化二:只针对写操作加锁 3.优化三:CAS 4.优化四:扩容方式 HashMap是线程不安全的,HashTable是线程安全的,关键方法加锁了.我们更推荐的是ConcurrentHashMap ,更优化的线程安全哈希表 接下来我们总结一下ConcurrentHashMap 进行了哪些优化,比H…

应用层——Web和HTTP

目录 1. HTTP概况 1.1 Web页面简介 1.2 URL-统一资源定位器 1.3 HTTP协议 2. HTTP连接的两种类型 2.1 HTTP非持久性连接(Non-persistent HTTP) 2.2 HTTP持久性连接(Persistent HTTP) 2.2.1 无流水(pipelining)的持久性连接 2.2.2 带有流水机制的持久性连接 3. HT…

WebDAV之葫芦儿·派盘+BookxNote

BookxNote 支持WebDAV方式连接葫芦儿派盘。 BookxNote是全新设计的电子书阅读学习笔记软件,以不同的思维方式重塑我们的学习过程。一边阅读一边划重点,提供多种划重点笔记工具,包括直线、矩形、圆形、高亮文本,图片摘录。高亮的文本自动编辑为重点的批注内容,还可以对重点…

1月17日,30秒知全网,精选7个热点

///快手与央视达成合作&#xff0c;可通过直播、点播和短视频三种方式看春晚 据官方介绍&#xff0c;这已经是快手连续第五年与总台春晚进行深度合作。此外&#xff0c;今年快手也与17家省市电视台达成了区域春晚转播合作&#xff0c;为用户奉上春晚视听盛宴。 ///俄罗斯或单方…

商业智能 BI 赋能年底的财务分析

职场中总有些不能说的秘密&#xff0c;比如月底和年底的时候&#xff0c;千万不要去惹财务&#xff01;尤其是年底&#xff0c;财务部门需要统计分析一整年的费用支出和经营收入&#xff0c;各种结算分析&#xff0c;还有新一年的预算&#xff0c;数据量庞大、业务系统分散、报…