与未定义数组初始化C ++上的教科书句子混淆

时间:2019-05-14 15:48:11

标签: c++ arrays string char

我正在读一本有关C ++编程的书。我从书中碰到一句话:“除了减轻乏味之外,未调整大小的数组初始化方法还使您可以更改任何字符串,而不必担心会意外忘记调整数组的大小。”当我编写一些代码来测试该语句然后在执行结束时运行该代码时,我收到一个错误消息,表明.exe已停止工作。并在我的问题中显示了其他代码,它给出了不兼容的类型错误,即新字符串的尺寸与char数组的尺寸不匹配。

因此,我测试了该句子以查看我对它的解释是否正确。请参阅下面的代码。

#include <iostream>
#include <cstdio>
#include <cstring>

using namespace std;

int main()
{
    char s[] = "";
    s = "Hello, my name is Mickey Mouse.";
    cout << s << endl;
    s = "Hello, my name is Mickey Mouse. I am 83 years old."
    cout << s << endl;

}

下一个代码示例:

#include <iostream>
#include <cstdio>
#include <cstring>

using namespace std;

int main()
{
    char s[] = "";
    cout << "Enter a string" << endl;
    cin.getline(s, 50);
    cout << s;
    cout << "How old are you" << endl;
    cin.getline(s, 50);
    cout << s;
}

我希望程序能够成功运行,但是会崩溃。

1 个答案:

答案 0 :(得分:1)

在第二个示例中,您将覆盖很大一部分堆栈,这可能会崩溃,尽管未定义的行为可能会导致其他意外结果。

char s[] = "";char s[1] = {'\0'};相同,后者仅包含一个元素,即空字符。这本书只是在说这种情况下,它可以为您确定尺寸并将其复制到书架中。

然后,当您使用cin.getline(s, 50);并告诉它实际上是50个字符长时,它可能会写到数组末尾并覆盖编译器放置在堆栈上导致损坏的其他内容。

对于getline之类的东西,如果确实有堆栈分配的数组,通常可以使用sizeof确定安全的大小,以适应将来的更改。

cin.getline(s, sizeof(s));

但是在C ++中,对于字符串,最好使用std::string,对于动态大小的数组,最好使用std::vector,对于固定大小的数组,最好使用std::array。除了直接支持更多功能外,它们还可以处理内存管理并使其更容易避免许多常见错误。

std::string line;
std::getline(std::cin, line);