使用 vector<> 时出现分段错误
Segmentation Fault whenever using vector<>
int main()
{
int n;
cin >> n;
char* temp_char;
vector<string> arr;
for (int i = 0; i < n; i++)
{
cin >> temp_char;
}
return 0;
}
嗨,每当我在这个程序中有 vector<string> arr;
时,无论我是否实际使用这个变量 arr,在第一个 forloop 中的第一个 cin 之后,我收到分段错误,不知道为什么这发生了?我在后面的编程中确实需要使用vector<string>
。
我正在 Ubuntu 下使用 g++ 进行编译,非常感谢任何帮助!
我不确定你的代码,但我认为你必须使用
字符 temp_char
代替
字符* temp_char
或者至少分配一些内存给 temp_char:
#include <iostream>
#include <vector>
int main()
{
int n;
std::cin >> n;
char* temp_char = new char[100];
std::vector<std::string> arr;
for (int i = 0; i < n; i++)
{
std::cin >> temp_char;
arr.push_back(temp_char);
}
for (auto s : arr)
std::cout << s << std::endl;
return 0;
}
char* temp_char;
vector<string> arr;
for (int i = 0; i < n; i++)
{
cin >> temp_char;
}
为什么是指针?
这里发生的事情是您创建了一个指向未定义位置的 char*
。 std::istream
(其中 std::cin
是一个对象)提供了一种将输入读入 char*
的特殊方法,但只有当目标 char*
指向有效内存时才有效。
否则,行为是未定义的,这意味着任何事情都可能发生,包括崩溃。
解决方案不是使用指针,而是 std::getline
:
#include <iostream>
#include <string>
#include <vector>
int main()
{
int n;
std::cin >> n;
std::cin.ignore();
std::vector<std::string> arr;
for (int i = 0; i < n; ++i)
{
std::string line;
std::getline(std::cin, line);
arr.push_back(line);
}
}
int main()
{
int n;
cin >> n;
char* temp_char;
vector<string> arr;
for (int i = 0; i < n; i++)
{
cin >> temp_char;
}
return 0;
}
嗨,每当我在这个程序中有 vector<string> arr;
时,无论我是否实际使用这个变量 arr,在第一个 forloop 中的第一个 cin 之后,我收到分段错误,不知道为什么这发生了?我在后面的编程中确实需要使用vector<string>
。
我正在 Ubuntu 下使用 g++ 进行编译,非常感谢任何帮助!
我不确定你的代码,但我认为你必须使用 字符 temp_char 代替 字符* temp_char 或者至少分配一些内存给 temp_char:
#include <iostream>
#include <vector>
int main()
{
int n;
std::cin >> n;
char* temp_char = new char[100];
std::vector<std::string> arr;
for (int i = 0; i < n; i++)
{
std::cin >> temp_char;
arr.push_back(temp_char);
}
for (auto s : arr)
std::cout << s << std::endl;
return 0;
}
char* temp_char; vector<string> arr; for (int i = 0; i < n; i++) { cin >> temp_char; }
为什么是指针?
这里发生的事情是您创建了一个指向未定义位置的 char*
。 std::istream
(其中 std::cin
是一个对象)提供了一种将输入读入 char*
的特殊方法,但只有当目标 char*
指向有效内存时才有效。
否则,行为是未定义的,这意味着任何事情都可能发生,包括崩溃。
解决方案不是使用指针,而是 std::getline
:
#include <iostream>
#include <string>
#include <vector>
int main()
{
int n;
std::cin >> n;
std::cin.ignore();
std::vector<std::string> arr;
for (int i = 0; i < n; ++i)
{
std::string line;
std::getline(std::cin, line);
arr.push_back(line);
}
}