从成员函数打印 vector<int> 元素时出现 C++ 段错误

Posted

技术标签:

【中文标题】从成员函数打印 vector<int> 元素时出现 C++ 段错误【英文标题】:C++ seg fault when printing a vector<int> element from a member function 【发布时间】:2016-12-07 22:59:31 【问题描述】:

我有一个带有 int 向量数据成员的类。我将向量初始化为 26 个元素,所有元素在构造函数中的值为 -99。我可以在构造函数中计算元素 0 并打印“-99”。然后构造函数调用另一个不修改向量的成员函数,但是当我尝试从该函数中计算元素 0 时,我得到了分段错误。下面我发布了标题相关部分和两个成员函数的屏幕截图。具体来说,代码按发布的方式工作,但如果我将第 26 行移至第 46 行,我会遇到段错误。有什么有用的建议吗?谢谢!

头文件:

class Seq

private:
    vector<int> assignments;
    string original;
    vector<Expression> sequence;
    bool valid;

public:

    void print_assignments();
    Seq();
    Seq(const string& s);
    void parse(const string s, int);
    vector<Expression> get_sequence();
    void display_sequence();
    void evaluate();

构造函数和它调用的成员函数(解析)。将第一个 cout 语句移动到第二个 cout 语句下面的行会导致错误。

Seq::Seq(const string& s)

    original = s;
    vector<int> assignments(26, -99);
    parse(s, s.size());
    cout << assignments[0] << endl;


void Seq::parse(const string s, int length)

    Expression e;
    string temp1, temp2;
    int i = 0;
    while((s[i] != ';')&&(i < length))
    
        i++;
    
    if(i>0)
    
        temp1 = s.substr(0, i);
        e.set(temp1);
        sequence.push_back(e);
        if(sequence.back().get_type() == 0)
        
            cout << sequence.back().get_token(0).get_token()[0] << endl;

        
    

【问题讨论】:

请将代码发布在问题中,而不是在外部链接上,尤其是不是图片。 好的,我会努力解决的 ^---- 不是所有的代码也不是任意的sn-p,而是minimal reproducible example拜托! 很抱歉这么苛刻,但是您对问题的关注越多,就会有更多的人愿意回答。你把你放进去的东西拿出来。 这是人们点击随机链接的最后一个网站 【参考方案1】:

您在构造函数中定义了一个名为“assignments”的局部向量,它隐藏了具有相同名称的数据成员,因此数据成员“assignments”的长度可能仍然为零,因此出现 seg 错误。

【讨论】:

【参考方案2】:

改变

while((s[i] != ';')&&(i < length))

while(i < length && s[i] != ';')

在您的版本中,如果s 为空或i 已经大于length,您将获得 AV 或段错误。

另外,停止命名变量temp

【讨论】:

我不知道我可以以这种格式列出多个条件!这会清理我的很多代码,谢谢!

以上是关于从成员函数打印 vector<int> 元素时出现 C++ 段错误的主要内容,如果未能解决你的问题,请参考以下文章

vector<int>v的v.at(100)函数与v[100] 有何不同

剑指offer系列——59/60.按之字形顺序打印二叉树/把二叉树打印成多行

把二叉树打印成多行

使用 vector<vector<int> > 成员实例化对象时的段错误

在构造函数中初始化成员变量二维向量

如何在 C++ 中打印矢量 <vector<int>>? [复制]