模拟实现mymcpy,memmove,strncpy
发布日期:2021-09-19 03:18:17
浏览次数:3
分类:技术文章
本文共 1694 字,大约阅读时间需要 5 分钟。
memcpy函数实现
memcpy: 内存拷贝函数 void *memcpy(void *dest ,const void *scr,size_t n); 从src所指向的内存地址的起始位置开始拷n个字节到目标dest所指的内存地址的起始位置中 。返回dest的指针。头文件#include<srtring.h>
1.src和dest所指的内存区域可能重叠,但是如果src和dest所指的内存区域重叠,那么这个函数并不能够确保src所在重叠区域在拷贝之前不被覆盖。而使用memmove可以用来处理重叠区域。
2.src和dest都不一定是数组,任意的可读写的空间均可
void* my_memcpy(void *dest, const void *src, size_t n){ void *ret = dest; while (n--) { *(char*)dest = *(char*)src; dest = (char*)dest + 1; src = (char*)src + 1; } return (ret);}
memmove函数实现
memmove: void *memcpy(void *dest ,const void *scr,size_t n); 用于从src拷贝n个字节到dest,如果目标区域和源区域有重叠的话,memmove能够保证源串在被覆盖之前 将重叠区域的字节拷贝到目标区域中 。但复制后src内容会被更改。但是当目标区域与源区域没有重叠则和memcpy函数功能相同。
void* my_memmove(void *dest, const void *src, size_t n){ void *ret = dest; if (dest <= src || (char*)dest >= ((char*)src + n)) { while (n--) { *(char*)dest = *(char*)src; dest = (char*)dest + 1; src = (char*)src + 1; } } else { dest = (char*)dest + n - 1; src = (char*)src + n - 1; while (n--) { *(char*)dest = *(char*)src; dest = (char*)dest - 1; src= (char*)src - 1; } } return (ret);}
strncpy函数实现
strncpy: char *strncpy(char *dest, const char *src, int n),把src所指向的字符串中以src地址开始的前n个字节复制到dest所指的数组中,并返回dest。
1. src串长度<=dest串长度,(这里的串长度包含串尾NULL字符)
1) 如果n>src,正常复制,如果src中有NULL,strncpy复制到NULL即使没到n也提前停止。
2) 如果n = src串长度,与strcpy一致。
3) 当n > dest串长度,dest栈空间溢出产生崩溃异常。
2. src串长度>dest串长度
如果n =dest串长度,则dest串没有NULL字符,会导致输出会有乱码。如果不考虑src串复制完整性,可以将dest 最后一字符置为NULL。
char* my_strncpy(char *dest, const char *src, size_t n){ char* ret = dest; assert(dest); assert(src); while (n--) { *dest++ = *src++; } *dest = '\0';//将dest最后置null return 0;}
memcpy和strncpy区别
memcpy:内存拷贝,不仅仅能拷贝字符串,它可以完整的拷贝n个字符,不会遇到 '\0' 就停止
strncy: 字符串拷贝,遇到'\0'就停止。
转载地址:https://blog.csdn.net/audience_fzn/article/details/76834504 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!
发表评论
最新留言
很好
[***.229.124.182]2024年04月07日 14时45分16秒
关于作者
喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
CSDN日报190912:前端、架构、数据库、游戏开发纯干货分享
2019-04-26
CSDN日报190917:手把手带你构建视频分类模型;深入浅出CNN
2019-04-26
CSDN日报190918:【技术干货】工作中Git的使用实践
2019-04-26
CSDN日报190919:游戏开发、数据库、架构干货分享
2019-04-26
CSDN日报190920:React Native发布新一代JS引擎Hermes
2019-04-26
CSDN日报190923:盘点那些被AI换脸、一键“脱”衣所滥用的AI模型
2019-04-26
CSDN日报190924:深度学习、开发干货分享
2019-04-26
PAT (Advanced Level) 1001 A+B Format (20 分)
2019-04-26
机器学习面试题第一天
2019-04-26
window10 caffe cpu-only安装
2019-04-26
YOLO-V3 Bbox预测解读
2019-04-26
论如何做到轻量级网络(Unet为例)
2019-04-26
Mask RCNN简图
2019-04-26
Cascade RCNN
2019-04-26
牛顿法
2021-06-29
对深度学习目前以及未来的看法 (AI时代可能延后,但总会到来)
2021-06-29
计算机网络应用层笔记
2019-04-26
地址栏输入网址enter查询后发生了什么
2019-04-26
计算机网络链路层知识点
2019-04-26