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]
时的行为方式,但这只是偶然发生的事情在内存中的布局方式。
在我的电脑上(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]
时的行为方式,但这只是偶然发生的事情在内存中的布局方式。