写一个完整的memcpy,strcpy,strlen char *a = "aa"; char s[] = "123456789"; char d[] = "123"; st
发布日期:2022-02-21 17:40:29
浏览次数:54
分类:技术文章
本文共 1445 字,大约阅读时间需要 4 分钟。
直接甩出我的代码和注释:
void* memcpy(void* cdes,void* csrc,unsigned int n){//0.任意类型都能复制,只能靠长度来限定复制完没 //1.判断源地址,目的地址为不为空 assert(cdes); assert(csrc); //2.保存源地址的地址名称 void* des=cdes; void* src=csrc; //3.考虑是否有地址重叠的地方 if(des((char*)src+n))//没有重叠 { while(n--) { *(char*)des=*(char*)src; des=(char*)des+1; src=(char*)src+1; } } else//如果有重叠,从高地址开始复制 { des=(char*)des+n-1; src=(char*)src+n-1; while(n--) { *(char*)des=*(char*)src; des=(char*)des-1; src=(char*)src-1; } } return des;}char* strcpy(char* des,char* src){//0.返回值为char*,是为了能够链式表达 //1.判断源地址,目的地址是否为空 assert(des); assert(src);///如果不这样,可以:if(des==NULL||src==NULL) throw("INVALID ARG"); //2.保存源地址和目的地址 char* cdes=des; char* csrc=src; //3.遇到'\0'表示结尾,注意需要把'\0'也复制过来 while((*cdes++=*csrc++)!='\0'); //(考虑内存覆盖,return (char*)memcpy(des,src,strlen(src)+1)); return des;}int strlen(char* src){//0.strlen不计算'\0' int i=0; if(src==NULL) return 0; while((*src++)!='\0') i++; return i;}
1.关于memcpy,需要注意的事项:
对于n而言,因为内部是转换为char* 来复制的,因此每次只能复制一个字节。所以在使用的时候,输入n的长度为字节长度。
最保险的写法是:n*sizeof(type);
2.关于strcpy,拷贝字符串因分配空间不足导致漏洞
char *a = "aa"; char s[] = "123456789"; char d[] = "123"; strcpy(d,s);
发现d的打印结果是123456789, s的打印结果是56789
理由:这是因为d , s的内存地址是相邻的,内存中(从0x28fefe~ 0x28ff02 )是这样排列的 :1 2 3 \0 1 2 3 4 5 6 7 8 9 \0,当执行strcpy(d , s)时,s的长度为10,所以内存中排列顺序变为:1 2 3 4 5 6 7 8 9 \0 7 8 9 \0 ,此时打印d, 打印的是d的地址到\0之间的字符,所以打印得到d:123456789,打印s,类似打印的是s的地址到\0之间的字符,对比位置发现s的地址对应的字符是
5 ,所以打印出的结果 s: 56789 。<借鉴了>转载地址:https://blog.csdn.net/weixin_40599276/article/details/100528975 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!
发表评论
最新留言
网站不错 人气很旺了 加油
[***.192.178.218]2024年03月22日 20时40分21秒
关于作者
喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
编程语言国产化的关键一战——对肆意污名化“木兰”编程语言说“不”
2019-04-26
各大媒体对「木兰」编程语言的不当言论盘点
2019-04-26
戳破针对「木兰」编程语言的拙劣谣言
2019-04-26
为「木兰」编程语言添加对中文命名标识符的支持
2019-04-26
悬赏万元,重现「木兰」编程语言编译器
2019-04-26
跳出编程语言本身看中文编程语言设计
2019-04-26
RPLY 入门例程中文化
2019-04-26
木兰编程语言入门教程之一——浅介
2019-04-26
木兰编程语言入门教程之二——控制走向
2019-04-26
基于「木兰」编译器,加十行代码实现 ∈ (属于集合)语法
2019-04-26
创建安卓键盘演示——“好不”
2019-04-26
木兰编程语言入门教程之三——函数和类型
2019-04-26
基于「木兰」逆向工程用 pyinstaller 生成可执行文件
2019-04-26
从微盟事件看商业数据公开化的必然趋势
2019-04-26
为新语言编写Visual Studio Code语法高亮插件
2019-04-26
手机编程环境初尝试-用AIDE开发Android应用
2019-04-26
Java关键字的汉化用词探讨
2019-04-26
程序员面试时用中文命名写白板代码的好处
2019-04-26
1992年日本对母语编程的可读性比较实验
2019-04-26
[转] 用python编写控制网络设备的自动化脚本3:启动
2019-04-26