C++运行报std::logic_error: basic_string::_S_construct null not valid错误如何解决
报错信息翻译
terminate called after throwing an instance of 'std::logic_error'
what(): basic_string::_S_construct null not valid
翻译为:程序运行终止,抛出了std::logic_error类型异常,异常描述为:basic_string构造函数不允许传入空指针。
错误产生原因
- 直接触发报错的代码是
string S = 0;:std::string没有接收整数类型的构造函数,此处的整数0会被隐式转换为空指针nullptr,匹配到std::string的const char*类型构造函数。C++标准要求传入该构造函数的指针必须指向合法的C风格字符串,传入空指针属于未定义行为,STL的实现直接抛出了你看到的逻辑错误异常。 - 代码还存在两处隐藏逻辑问题:
- 变量
T仅声明未初始化,后续for循环判断条件读取T的值时会拿到栈上的垃圾值,循环次数完全不可控。 - 原代码将
cin >> S >> R写在T次循环外部,若要实现多组测试用例重复读取字符串和重复次数,应该把输入逻辑放到循环内部。
- 变量
修复方案
修改3处问题即可正常运行:
- 字符串S不需要提前赋初始值,改为直接声明
string S; - 增加读取测试用例数量T的逻辑
- 将S和R的读取逻辑放到T次循环内部,每次循环读取一组输入
修复后的完整代码:
#include <iostream> #include <string> using namespace std; int main() { string S; int T,R; cin >> T; for(int i = 0; i < T; i++) { cin >> S >> R; for(int k = 0; k < S.length(); k++) { for(int j = 0; j < R; j++) { cout << S[k]; } } cout << endl; } return 0; }
内容的提问来源于stack exchange,提问作者lucia_x.j.x_alcul
相关产品推荐
相关产品推荐

