strcpy拷贝越界问题(转)

原文出自:http://lixiaomeng.blog.51cto.com/3714496/982292


一. 程序1

#include<stdio.h>  
#include<string.h>  
void main()  
{  
 char s[]="123456789";  
 char d[]="123";  
 strcpy(d,s);  
 printf("d=%s,\ns=%s",d,s);  
} 

执行结果:
这里写图片描述
解释:
首先要解释一下,char s[]=”123456789”; char d[]=”123”; 这样定义的数组和变量存放在栈内存中。
栈内存是一个自顶向下分布的数据结构,那么越先定义的变量地址就越高,越后定义的地址就越低。
s比d定义在前,那么s得到了高地址,而d得到了相对低的地址,那么内存中的存放形式就是
d[] <- | -> s[]
‘1’ ‘2’ ‘3’ ‘\0’ | ‘1’ ‘2’ ‘3’ ‘4’ ‘5’ ‘6’ ‘7’ ‘8’ ‘9’ ‘\0’
字符串拷贝后:
‘1’ ‘2’ ‘3’ ‘4 ’ | ‘5’ ‘6’ ‘7’ ‘8’ ‘9’ ‘\0’ ‘7’ ‘8’ ‘9’ ‘\0’
中间的‘|’表示s[]的起始位置。
所以此时输出的是d的值是 ‘1’ ‘2’ ‘3’ ‘4’ ‘5’ ‘6’ ‘7’ ‘8’ ‘9’ ‘\0’,
s的值是 ‘5’ ‘6’ ‘7’ ‘8’ ‘9’ ‘\0’

二. 程序2

#include<stdio.h>  
#include<string.h>  
void main()  
{  
  char d[]="123";  

 char s[]="123456789";  
 strcpy(d,s);  
 printf("d=%s,\ns=%s",d,s);  
}  

这里写图片描述
说明:
虽然可以看到正确的输出结果d=123456789,s=123456789执,但是产生运行错误!
这是因为字符串拷贝后,越过了目标字串的实际空间,访问到了不可预知的地址了。

三. strcpy函数原型

//已知strcpy函数的原型是:  
char * strcpy(char * strDest,const char * strSrc);  


//实现代码  
char * strcpy(char * strDest,const char * strSrc)  
{  
if ((strDest==NULL)||(strSrc==NULL))  

throw "Invalid argument(s)";   

char * strDestCopy=strDest;   

while ((*strDest++=*strSrc++)!='\0');//最后追加了'\0'   

return strDestCopy;  
}  
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值