逆转动态分配的数组的程序中的分段错误

时间:2016-11-27 02:27:21

标签: c++ pointers dynamic segmentation-fault dynamic-allocation

我正在进行测试并且在线测试引擎显示分段错误,这是令人困惑的,因为没有进一步的细节,我检查指针没有NULL,他们工作得很好,但不要如何数组这里有效。因为在调试时,一切都很好,直到我尝试cout /打印出阵列。它的报道是在这里粉碎并打破。如果它破裂我在这里什么都不做,我打破了或继续。如果我继续,它运行得很好。所以我真的很困惑。

我的电脑是Windows 7,我在visual studio 2010 c ++中运行代码。 调试并不是解决问题的方法,我学习c ++的效率不高。 解决数组需要动态分配。

#include <cmath>
#include <cstdio>
#include <vector>
#include <iostream>
#include <algorithm>
using namespace std;
void reverseArray(int size, int num[]) {
    if(size>1) {
        int *p = &num[size-1];
        int *f = num;
        for(int i = 0;i < size/2; i++){
            swap(*p, *f);
            p--;
            f++;
        } 
    }
}

int main() {
    int len;
    int a[len];/This is the bug, can't use uninitialized var assign array/
    cin >> len;
    for(int i = 0; i < len; i++){
        cin >> a[i];
    }
    reverseArray(len, a);
    for(int i = 0; i < len; i++){
        cout << a[i] << " ";
    }
    return 0;
}

这与动态分配有关,当我在java中工作时,我创建了一个新数组。 我必须

int[] newArray = {2,4,1,2,3};

int[] newArray = new int[] {2,4,1,2,3};

最后,这个问题解决了,这让我很开心。 阅读和学习非常重要,编码也很重要。 谢谢大家,

使用 vector 而不是使用数组。 这会更容易。

#include <cstdio>
#include <vector>
#include <iostream>
using namespace std;
int main() {
    int a;
    int len;
    vector<int> myvector;
    cin >> len;
    for(int i = 0; i < len; i++){
        cin >> a;
        myvector.push_back(a);
    }
    reverse(myvector.begin(), myvector.end());
    for(int i = 0; i < len; i++){
        cout << myvector[i] << " ";
    }
    return 0;
}

再次使用数组我怀疑以下代码):

#include<iostream>
//#include<cstdlib>
using namespace std;

void reverseArray(int size, int nums[]){
    if(size > 1){
        int *p = &nums[size-1];
        int *q = nums;
        for(int i = 0; i< size/2; i++){
            swap(*p, *q);
            p--;
            q++;
        }
    }
}

int main(){
    int len;
    cin >> len;
    int *a = new int[len];//a point to the first ele.

    for(int i = 0; i< len; i++){
        cin >> a[i];
    }
    reverseArray(len, a);
    for(int i = 0; i < len; i++){
        cout << a[i] << " ";
    }
    delete [] a;
    return 0;

}

它在我的笔记本电脑上工作得很好,这很令人困惑,因为它是指针,但我像数组一样使用它。它应该不起作用......

最终阵列版本: http://ideone.com/ZMsD35 做得很完美。

#include<iostream>
using namespace std;

int main(){
    int len;
    cin >> len;
    int *a = new int[len];
    for(int i = 0; i< len; i++){
        cin >> a[i];
    }
    reverse(a, a+len);
    for(int i = 0; i< len; i++){
        cout << a[i];
    }
    delete [] a;
    system("pause");
    return 0;

}

1 个答案:

答案 0 :(得分:0)

段错误最可能的原因是输入。当测试软件通过len大小足以溢出自动存储​​区域时,程序在此行崩溃:

int a[len];

len的确切值取决于系统,但输入1,000,000应该在大多数常见系统上执行。

修复非常简单 - 用

替换声明
int a* = new int[len];

这会将数据放在动态内存中,而不是自动内存中。它还将使您的程序符合标准,因为C ++中的可变长度数组是标准的扩展。

为避免内存泄漏,请勿忘记删除a

delete[] a;