【问题标题】:Segmentation Fault whenever using vector<>使用向量<>时出现分段错误
【发布时间】:2015-09-19 09:01:35
【问题描述】:
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&lt;string&gt; arr;,无论我是否实际使用这个变量arr,在第一个forloop中的第一个cin之后,我收到segmentation fault,不知道为什么会这样?我确实需要在以后的编程中使用vector&lt;string&gt;。 我在 Ubuntu 下使用 g++ 编译,任何帮助将不胜感激!

【问题讨论】:

  • 尝试使用string temp_str,它会让事情变得更容易。

标签: c++ vector segmentation-fault iostream


【解决方案1】:
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);
    }
}

【讨论】:

    【解决方案2】:

    我不确定你的代码,但我认为你必须使用 char 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[100]。另外,如果有人输入的单词长度超过 99 个字符怎么办?
    • 最好使用 std::string 并且永远不要使用 new[]
    • 问题中的代码已经在std::vector 中使用了std::string。为什么要向他们展示如何引入缓冲区溢出和内存泄漏?
    • 好吧,如果我只在分配中添加std::string instrad,OP 可能会因为std::string 的实现而错过分段错误的真正原因@ 隐藏它。但是是的,我的不是一个合适的解决方案,更像是展示错误背后的概念。
    • 我同意@SPIFF 的观点,即 OP 想知道 char* 不起作用。您无法通过使用不同的类型来解释这一点。不过,建议更好的方法(std::string)的评论可能会很有用。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-05
    • 2021-12-25
    • 1970-01-01
    相关资源
    最近更新 更多