获取分段错误(矢量声明)

时间:2017-09-02 12:03:11

标签: c++ arrays vector runtime-error

找出数组中非负数的最大子数组。 子阵列应该是连续的。也就是说,通过选择第二个和第四个元素并跳过第三个元素而创建的子数组是无效的。

最大子阵列是根据子阵列中元素的总和来定义的。如果sum(A)>,则子阵列A大于子阵列B.总和(B)。

这是我的解决方案:

vector<int> Solution::maxset(vector<int> &A) {
// Do not write main() function.
// Do not read input, instead use the arguments to the function.
// Do not print the output, instead return values as specified
// Still have a doubt. Checkout www.interviewbit.com/pages/sample_codes/ for more details

    vector <int> bla;
    int sum[100]={0};
    int k = 0;
    int j = 1;

    for (int i =0; i < A.size(); i++){
        if (A[i] > -1){
            sum[k] = A[i] + sum[k];
        }
        else {
            k++;
        }
    } 

    cout<<sum[0]<<" ";
    cout<<sum[1]<<" ";
    cout << sum[2] << " ";

    int s = 0;

    for (int i =0; i< 100; i++){
        if (s < sum[i]){
            s = sum[i];
            k = i;
        }
    }

    cout << s;

    int count = 0;
    for (int i =0; i < A.size(); i++){
        if (A[i] < 0) {
            count ++;
        }

        if (count == k) {
            int j = i+1;
            int x = 0;
            while (A[j] > 0 && j< (A.size()-1)) {
                //  bla[x] = A[j];
                x++;
                j++;
            }
        }
    } 

    return bla;
}

如果我取消注释行bla [x] = A [j],我会得到分段错误。有人可以解释如何解决这个错误吗?我在某处看到堆栈中没有足够的空间。我不明白怎么做。 谢谢

1 个答案:

答案 0 :(得分:0)

您可以将大小传递给矢量对象,也可以调用它的默认构造函数来创建0大小的矢量对象。

std::vector<int> vecInt(10);
for(int i(0); i < vecInt.size(); i++)
    vecInt[i] = i;

或者您可以声明大小为0的向量:

std::vector<int> vecInt;
vecInt[0] = 10; // segfault

因为您尝试将值存储在未分配的空间中。

要解决此类问题,请使用push_back存储并pop清除:

所以你的例子可以是这样的:

while (A[j] > 0 || j< (A.size()-1)) {
     //  bla[x] = A[j];
     bla.push_back(A[j]);
     x++;
     j++;
}