下面的 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
正在写入某个随机内存位置。
最佳答案
C++ 标准未定义您的程序的行为。
这意味着任何 C++ 实现(例如编译器)都可以做任何它想做的事。打印“你好!”在标准输出上将是一个可能的结果。就 C++ 标准而言,格式化硬盘仍然是可以接受的。但实际上,堆上的一些随机内存将被覆盖,并产生不可预知的后果。
请注意,该程序甚至可以按预期运行。目前。除非是星期五。或者直到你修改了一些完全不相关的东西。这就是您的情况,从程序员的角度来看,这是最糟糕的事情之一。
稍后,您可能会添加一些代码并看到您的程序严重崩溃,并认为问题出在您刚刚添加的代码上。这可能会导致您花费很长时间来调试代码的错误部分。如果发生这种情况,欢迎来到 hell 。
正因为如此,你永远不应该依赖未定义的行为。
关于c++ - strcpy 工作正常,即使没有分配内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31024976/