带向量的C ++分段错误

时间:2014-01-25 21:24:12

标签: c++ vector segmentation-fault

在下面的代码中,我正在尝试使用总销售额显示每日报告。输出正确但退出时出现分段错误。我该如何解决这个问题?

输出

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

2 个答案:

答案 0 :(得分:4)

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

要解决此问题,只需将循环钳位到stockVector.size() - 1

即可
for (int index=0;index<stockVector.size() - 1;index++)
{
    // ...

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

答案 1 :(得分:3)

stockVector[index+1]

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

如果你需要查看下一个元素,你需要验证你没有超过向量的末尾,你还需要弄清楚当你到达最后一个元素时要做什么和/或有奇数个元素。