原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 、作者信息和本声明。否则将追究法律责任。http://lixiaomeng.blog.51cto.com/3714496/982292
《strcpy拷贝越界问题》
一. 程序一
- #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'
二. 程序二
- #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');
- return strDestCopy;
- }
本文出自 “技术创造人生” 博客,请务必保留此出处http://lixiaomeng.blog.51cto.com/3714496/982292