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

标签 c++ memory constructor strcpy

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

相关文章:

android - 嵌入式linux/android内核开发流程

检查 C 中的内存释放是否正确

java - arraylist 构造函数中的 "no suitable method found for add(java.lang.String)"?

java - 如何在语句后调用构造函数?

c++ - 使用 "auto"的声明是否匹配使用具体类型说明符的 extern 声明?

c++ - 向后读取文件的适当 madvise 设置是什么?

c++ - 关于我不理解的类对象的编译器行为

c++ - 是什么让一种语言不愿意/不能包含 RAII?

c - 如何在 linux 上将两个虚拟地址映射到同一物理内存上?

javascript - 从动态创建的子构造函数调用父构造函数