strcpy(str1, str2);如果str1的长度不够strcpy()会不会自动把str1长度增加?

hozi 2003-06-19 05:00:18
char *str1;
char *str2 = "abcdefghijklmn";
str1 = new char[5];
strcpy(str1, str2);
cout << "str1=" << str1 << " str2=" << str2 << endl;
如果str1的长度不够strcpy()会不会自动把str1长度增加?
我输出的结果:str1=abcdefghijklmn str2=abcdefghijklmn
虽然结果是我想要的,但str1会不会把有用的内存占用了?
...全文
1839 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
Cypher 2003-06-22
  • 打赏
  • 举报
回复
To zteliubin(bill)

你的作法有些问题,strlen(ss)并不一定就是缓冲区的实际长度,如果它第一个字节就是0,那么什么都拷贝不进去,即使它的实际可用空间是128字节。如果是没有初始化的数组也是有问题的。

不一定说初学者什么的,我见过工作六七年的人也有出现这种错误的。

用strncpy并不能保证不写越界,还是要看你会用,第三个参数一定要小于等于第一个参数的实际长度,如
strncpy(str1, str2, strlen(str2));
和用strcpy没什么区别。这错误可是发生在实际产品中的,而不是我杜撰的。

另外strncpy有一个可能就是,如果第二个串长度大于第三个参数,那么在第一个串中这个函数是不加'\0'的,生成的并不是有效字节串,这是它和strcpy的另一个错误。
zteliubin 2003-06-19
  • 打赏
  • 举报
回复
越界了,千万不能这样用,当不能确定目的串长度时,建议时用:
strncpy(ss,sd,strlen(ss));
初学者常常发生访问越界的问题,比如字符串,数组,指针等。
  • 打赏
  • 举报
回复
不会自动增加目标字符串的长度;
著名的黑客攻击手段--缓冲区溢出,就是根据这个特点产生的。
当调用strcpy(),strcat(),gets(),fgets()...而传入一段过长的串时,如果程序员未检查源字符串的长度。就会导致紧跟在目标字符串后面的内存被覆盖,如果该内存记录的是函数的返回地址,那么当函数该返回时,程序就会试图跳到该地址内容(为一指针值)所指的地方继续执行。从而造成安全漏洞。
解决方法:
尽量使用这些函数对应的安全类型函数。
如:strncpy(),strncat()..
  • 打赏
  • 举报
回复
No overflow checking is performed when strings are copied or appended. The behavior of strcpy is undefined if the source and destination strings overlap.
  • 打赏
  • 举报
回复
No overflow checking is performed when strings are copied or appended. The behavior of strcpy is undefined if the source and destination strings overlap.
rtdb 2003-06-19
  • 打赏
  • 举报
回复
不会自动把str1长度增加, 反而会把后面的其它数据破坏了,
属于严重的BUG, 且较难发现。非高手常犯这种错误。

24,852

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 工具平台和程序库
社区管理员
  • 工具平台和程序库社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧