gpt4 book ai didi

c++ - strcpy 工作正常,即使没有分配内存

转载 作者:太空宇宙 更新时间:2023-11-04 14:53:55 26 4
gpt4 key购买 nike

下面的 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com