用C ++初始化数组

时间:2015-07-28 05:39:45

标签: c++ arrays

我试图通过声明初始化一个数组:

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,为什么我得到那个错误?

4 个答案:

答案 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 <<,这可能不是最好的主意。