在一个动态分配的数组的程序中分割故障



我正在进行测试和在线测试引擎显示分段错误,这令人困惑,因为没有更多的细节,我检查了指针no no non no null,它们的工作非常好,但是请't 数组在这里工作。因为在调试时,一切都很好,直到我尝试表达/打印出数组。它报告了A在这里被压碎并休息。如果它破裂,我什么也没做,我打破或继续。如果我继续,它运行良好。所以我真的很困惑。

我的计算机是Windows 7,我在Visual Studio 2010 C 中运行代码。调试并不清楚解决问题,我正在学习C 的效率不是很高。用 array 求解需要动态分配。

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

使用 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;
}

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

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

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

int a[len];

len的确切值是系统依赖性的,但是输入为1,000,000,应该在大多数常见的系统上进行。

修复程序真的很简单 - 用

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

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

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

delete[] a;

最新更新