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

Segmentation fault in a program that reverses a dynamically allocated array

我正在做一个测试,在线测试引擎显示分段错误,这令人困惑,因为没有进一步的细节,我检查了指针没有 NULL,它们工作得很好,但不知道如何 array 这里有效。因为在调试时,一切都很好,直到我尝试 cout/print 出数组。它报告说这里被压碎了。如果它坏了,我在这里什么也做不了,我点击 break 或 continue。如果我继续,它 运行 就好了。所以我真的很困惑。

我的电脑是windows7,我运行代码是visual studio2010 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};

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

并使用 向量 而不是使用数组。 这会更容易。

#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;
}

再次使用Array我怀疑下面的代码):

#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;

}

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

最终数组版本: 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;

}

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

int a[len];

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

修复非常简单 - 将声明替换为

int a* = new int[len];

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

完成后不要忘记删除 a 以避免内存泄漏:

delete[] a;