strcpy 函数如何将一个大字符串复制成一个较小的字符串?

How can the strcpy function copy a large string into a smaller string?

在下面的代码中,我似乎可以将整个大字符串复制到一个小字符串中。

所以我的问题是,它是如何工作的?我只给str1分配了2个字符,但它可以存储更长的字符串。

  1. 这是否意味着 strcpy 正在修改不属于我们的堆栈内存?
  2. 栈上的数组初始化后可以动态增长吗?
  3. str1 大小在复制操作后没有改变,但它包含一个更长的字符串。太疯狂了!

我粘贴代码只是为了让我的观点更清楚:

    char str1[2] = "a";
    char str2[100] = "abcd";

    cout<<"Before copying"<<endl;
    cout<<"str1: "<<str1<<" size: "<<sizeof(str1)<<endl;
    cout<<"str2: "<<str2<<" size: "<<sizeof(str2)<<endl;

    strcpy(str1, str2);

    cout<<"After copying"<<endl;
    cout<<"str1: "<<str1<<" size: "<<sizeof(str1)<<endl;
    cout<<"str2: "<<str2<<" size: "<<sizeof(str2)<<endl;

So my question, how does that work?

不好。它不会进行任何检查来确认您正在执行的操作是否有意义。您是负责检查的人(这显然会导致错误)。

strcpy 通常只是字节复制循环。它将数据写入增加的地址。只要你写入的内存是“你的”,在这样的复制打印之后字符串就可以正常工作;问题是您覆盖的内存中实际有什么。

  1. 是的,你很“幸运”它没有断掉第二根弦。 strcpy 的要求要求您提供足够的输出存储空间。
  2. 通常不会,尤其是涉及堆栈更上层的数组时。
  3. 不是字符串大小,是用sizeof得到的静态数组大小。你可能想到的是 strlen.

总而言之,永远不要在 C++ 中使用 C 函数,除非你有充分的理由使用 std::string 并且 none 会发生这些问题。事实上,这就是您的编译器可能告诉您的内容:

Error C4996 strcpy: This function or variable may be unsafe. Consider using strcpy_s instead.

如果你听过,运行 节目时你会得到以下内容:

但是,这些额外的检查并不能替代编写良好、运行良好的程序。