下面这个程序,string长度不是已经超过result_str的限制了,为什么还可以进行复制?
我用VC 6.0运行的,,输出结果为“qazxswedcvfrtgbnhyuj 20” 没有出现警告或运行错误,而且数组长度改变了!这是为什么啊??
#include <iostream>
#include <string>
#include <cstring>
using namespace std;
int main()
{
string str("qazxswedcvfrtgbnhyuj");
const size_t SIZE = 12;
char result_str[SIZE];
strcpy(result_str, str.c_str());
cout << result_str << endl;
cout << strlen(result_str) << endl;
return 0;
}
[解决办法]
strcpy是不会检查边界的, 已经越界了.
strlen这类的函数都不会检查边界, 都会直到看见 \0 为止,
你可以跟踪下strcpy这个函数的源码就知道了.
[解决办法]
strcpy不做边界检查,也就是说你result_str的内存已经溢出了!最好还是用安全函数吧!
[解决办法]
缓冲区溢出了!这就是strcpy的不足之处,所以以后用这个函数要注意,会覆盖其他的内存空间!
[解决办法]
越界了,你现在看起来没什么问题, 其实你其他地方的内存空间已经发生了不可预期的变化
少用strcpy ,strncpy 是较为安全的方法
[解决办法]
strncpy(d,s,n);d[n]=0;
[解决办法]
就是,已经越界了。此时内存中的其他地址的值可能已经被被你改变了,有可能造成致命错误