向量的 C++ 分段错误

Posted

技术标签:

【中文标题】向量的 C++ 分段错误【英文标题】:C++ Segmentation fault with vector 【发布时间】:2014-01-25 21:24:11 【问题描述】:

在下面的代码中,我试图显示带有总销售额的每日报告。输出正确但因分段错误而退出。请问这个怎么解决?

输出是

Date        Total Sales
03Nov13     745
13Jan14     538
Segmentation fault (core dumped)

代码:

for (int index=0;index<stockVector.size();index++)
                    
            if ( stockVector[index].getTransDate() == stockVector[index+1].getTransDate())
            
                int totalSum = ((stockVector[index].getQtyPurchase() * stockVector[index].getUnitPrice()) +
                        (stockVector[index+1].getQtyPurchase() * stockVector[index+1].getUnitPrice()));                 
                cout << stockVector[index].getTransDate() << "\t\t" << totalSum << endl;
            
        

这是我存储在向量中的文本文件中的数据。

ProductID:Description:Price:Qty:Transaction Date

003:Calendar:5:104:03Nov13
079:Revlon Foundation:5:45:03Nov13
005:MacBook Pro:3500:1:10Jan14
010:NesCafe Latte:1:9:1Jan14
095:Lipton Tea:5:95:13Jan14
096:Milk Tea:3:21:13Jan14
066:Samsung Note 3:450:1:23Jan14
088:HP Mouse:23:100:24Jan14

【问题讨论】:

【参考方案1】:

在您的循环中,您使用的索引(条件中的index+1)可以引用超出向量最后一个元素的元素(当index 到达stockVector.size() - 1 时)。在数组末尾以外的位置取消引用指针(stockVector 在调用其 operator[] 时会这样做)是未定义的行为,因此任何事情都可能发生(包括获得正确的结果然后崩溃)。

要解决这个问题,只需将循环夹在stockVector.size() - 1

for (int index=0;index<stockVector.size() - 1;index++)

    // ...

但是,您可能必须评估此解决方案是否适合矢量的最后一个元素。

【讨论】:

stockVector[index+1] 在循环的最后一次迭代中【参考方案2】:
stockVector[index+1]

index 到达size() - 1 时,这显然会超过向量的末尾。

如果您需要查看下一个元素,您需要确认您没有越过向量的末尾,并且您还需要弄清楚当您到达最后一个元素时该怎么做和/或有奇数个元素。

【讨论】:

以上是关于向量的 C++ 分段错误的主要内容,如果未能解决你的问题,请参考以下文章

带有向量和字符串的 C++ 分段错误

在 C++ 中比较来自向量的字符串时出现分段错误

在 C++ 中的向量中键入所有值后出现分段错误(核心转储)

C++:当我添加看似无关的代码行时,分段错误消失了

为啥 C++ 标准向量在分配或调整大小时会出现段错误? [关闭]

c++向量分配错误分段错误