【发布时间】:2015-09-10 13:29:45
【问题描述】:
以下 c++ 程序运行良好,即使我没有为chr 分配任何内存。
我浏览了谷歌,所以遇到了这个
Why does this intentionally incorrect use of strcpy not fail horribly?
这里程序适用于空间小于源的目标。
这是否也适用于我的情况,strcpy 写入堆中的随机位置?
#include<iostream>
using namespace std;
class Mystring
{
char *chr;
int a;
public:
Mystring(){}
Mystring(char *str,int i);
void Display();
};
Mystring::Mystring(char *str, int i)
{
strcpy(chr,str);
a = i;
}
void Mystring::Display()
{
cout<<chr<<endl;
cout<<a<<endl;
}
int main()
{
Mystring a("Hello world",10);
a.Display();
return 0;
}
output:-
Hello world
10
我用另一个 c++ 程序尝试了同样的事情,使用任何类和类成员,我能够看到崩溃。
#include<iostream>
using namespace std;
int main()
{
char *src = "Hello world";
char *dst;
strcpy(dst,src);
cout<<dst<<endl;
return 0;
}
请帮助我理解第一个 c++ 程序中的行为。内存是否以某种方式分配或strcpy 正在写入某个随机内存位置。
【问题讨论】:
-
这只是未定义的行为,不会自动分配任何内容。
-
这不很好,你只是没有看到问题。然而。这是最“可怕的失败”,因为你可能直到真正糟糕的事情发生之前才意识到这样的错误(不是在这个玩具程序中,而是在现实世界的使用中......丢失所有数据,在金钱上做错事等等等等.)
-
是否像写入某个随机内存位置一样?如果是这样的话,如果
chr只指向那个位置怎么办?请帮助我理解这一点。 -
Is it like writing into some random memory location?是的。
标签: c++ memory constructor strcpy