strcpy 函数如何将一个大字符串复制成一个较小的字符串?
How can the strcpy function copy a large string into a smaller string?
在下面的代码中,我似乎可以将整个大字符串复制到一个小字符串中。
所以我的问题是,它是如何工作的?我只给str1分配了2个字符,但它可以存储更长的字符串。
- 这是否意味着 strcpy 正在修改不属于我们的堆栈内存?
- 栈上的数组初始化后可以动态增长吗?
- 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
通常只是字节复制循环。它将数据写入增加的地址。只要你写入的内存是“你的”,在这样的复制打印之后字符串就可以正常工作;问题是您覆盖的内存中实际有什么。
- 是的,你很“幸运”它没有断掉第二根弦。
strcpy
的要求要求您提供足够的输出存储空间。
- 通常不会,尤其是涉及堆栈更上层的数组时。
- 不是字符串大小,是用
sizeof
得到的静态数组大小。你可能想到的是 strlen
.
总而言之,永远不要在 C++ 中使用 C 函数,除非你有充分的理由使用 std::string
并且 none 会发生这些问题。事实上,这就是您的编译器可能告诉您的内容:
Error C4996 strcpy
: This function or variable may be unsafe. Consider using strcpy_s instead.
如果你听过,运行 节目时你会得到以下内容:
但是,这些额外的检查并不能替代编写良好、运行良好的程序。
在下面的代码中,我似乎可以将整个大字符串复制到一个小字符串中。
所以我的问题是,它是如何工作的?我只给str1分配了2个字符,但它可以存储更长的字符串。
- 这是否意味着 strcpy 正在修改不属于我们的堆栈内存?
- 栈上的数组初始化后可以动态增长吗?
- 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
通常只是字节复制循环。它将数据写入增加的地址。只要你写入的内存是“你的”,在这样的复制打印之后字符串就可以正常工作;问题是您覆盖的内存中实际有什么。
- 是的,你很“幸运”它没有断掉第二根弦。
strcpy
的要求要求您提供足够的输出存储空间。 - 通常不会,尤其是涉及堆栈更上层的数组时。
- 不是字符串大小,是用
sizeof
得到的静态数组大小。你可能想到的是strlen
.
总而言之,永远不要在 C++ 中使用 C 函数,除非你有充分的理由使用 std::string
并且 none 会发生这些问题。事实上,这就是您的编译器可能告诉您的内容:
Error C4996
strcpy
: This function or variable may be unsafe. Consider using strcpy_s instead.
如果你听过,运行 节目时你会得到以下内容:
但是,这些额外的检查并不能替代编写良好、运行良好的程序。