写一个完整的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 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:编程题-----判断树是否平衡(常规解法+优化)
下一篇:c++各种排序算法实现

发表评论

最新留言

网站不错 人气很旺了 加油
[***.192.178.218]2024年03月22日 20时40分21秒

关于作者

    喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!

推荐文章