我试图通过声明初始化一个数组:
char a[]="abc";
cout<<a<<" "<<sizeof(a);
输出:
abc 4
现在,当我这样做时:
strcpy(a,"abcdefgh");
cout<<a<<" "<<sizeof(a);
输出:
abcdefgh 4
然后我收到m.exe
已停止工作的错误。 (m
是我文件的名称)
我想问一下每个字符是否需要1个字节,并且数组a
的大小是4个字节,那么大小9
字节的字符串如何被初始化为a
,为什么我得到那个错误?
答案 0 :(得分:3)
你的数组是4个字节,你的字符串是9个字节,你把字符串应用到数组,你得到一个错误。你期望发生什么?
C ++有一个名为&#39; undefined behavior&#39;的概念。在许多情况下,如果你的程序破坏了C ++的规则,那么你就会得到未定义的行为,这就意味着它所说的一切,任何事情都可能发生。这包括您的程序似乎正常工作,并不能保证上述程序根本不会产生任何错误。
如果你希望你的程序能给你一些有用的错误信息,说明你做错了什么,或者你因为错误而期望你的程序无法编译,那么我担心你会看到错误的编程语言。
答案 1 :(得分:2)
您的数组是4个字节,并且您正在尝试将内容复制到9字节。
strcpy(a,"abcdefgh");
为什么它会崩溃!!!!
如何将9字节大小的字符串初始化为
这是&#34;未定义的行为&#34;在c ++中。
答案 2 :(得分:0)
数组a
的字节数为4
,正在复制9
个字节,结果为Undefined Behavior
。
请注意,所有字符串都必须以\0
字符结尾。此外,您的字符串中没有这样的字符,因此编译器继续从数组边界读取字符串。
考虑以下一行:
strcpy(a,"abcdefgh");
此行将字符串复制到数组中,同时覆盖内存中后续位置的内容。
但sizeof()
只返回数组a
占用的实际内存大小,即4
字节(“abc”+ \0
字符)。
答案 3 :(得分:0)
像strcpy()
这样的函数来自C,它们非常低级&#34;。它们涉及大量的人工记账,分配了多少内存。与他们犯错很容易。你做了一个!
正如其他人所说的那样:如果你的困惑点是&#34;为什么编译器没有阻止我做这个&#34; ,答案就是你使用的是用很少的检查来处理字符串的方法。关于C ++的好消息是它在你需要时提供了低级别的能力,但是还在标准库中提供了很好的类来帮助它。
例如,有std::string:
#include <string>
#include <iostream>
using namespace std;
int main() {
string a = "abc";
cout << a << a.length();
a = "abcdefgh";
cout << a << a.length();
// Note: it's okay to leave off return in C++, for main() only!
}
那应该给你:
abc 3
abcdefgh 8
请注意,即使已经为您处理了null终止符的问题,因此您也不必担心它。您可以使用&#34; +&#34;将字符串追加到一起。并且做了许多你期望从其他语言中获得的东西,但是你可以更多地控制复制的方式和时间(当你需要时)。
所有这些说:有更好的方法来学习非常早期的C ++概念,而不是在StackOverflow上提问。这可能会让人发疯,因为你没有努力通过一本好书或教程来完成工作!所以考虑采取这一举措:
The Definitive C++ Book Guide and List
如果您对学习C感兴趣并且坚持使用非常低级别的东西,我建议您留在C中。如果您正在编写新代码并且它是strlen()
的混合使用cout <<
,这可能不是最好的主意。