Stringstream 和 char*[] 分段错误

Stringstream & char*[] segmentation fault

在我的电脑上(Win10,WSL 1,Ubuntu 20.04)

这段代码可以编译并且 运行 正确,

#include <iostream>
#include <cstring>
#include <sstream>
using namespace std;

int main()
{
    ios::sync_with_stdio(false);
    char *test[30];
    string a;
    cin >> a;

    // stringstream ss;

    strcpy(test[0], a.c_str());
    cout << test[0] << endl;
}

输入:“abc”

输出:“abc”

但是这段代码会遇到默认分段:

#include <iostream>
#include <cstring>
#include <sstream>
using namespace std;

int main()
{
    ios::sync_with_stdio(false);
    char *test[30];
    string a;
    cin >> a;

    stringstream ss;

    strcpy(test[0], a.c_str());
    cout << test[0] << endl;
}

输入:“abc”

输出:分段错误(核心已转储)

char *test[30] 定义了一个包含 30 个指向 char 的指针的数组。 test[0]strcpy 中使用之前未初始化。 C++ 标准未定义由此产生的行为。

您必须为字符串的副本提供内存并分配 test[0] 以指向该内存。

stringstream ss; 的存在或不存在而产生的任何影响都只是偶然的;它可能会影响程序在未初始化的情况下使用 test[0] 时的行为方式,但这只是偶然发生的事情在内存中的布局方式。