【问题标题】:Segmentation fault in a program that reverses a dynamically allocated array反转动态分配数组的程序中的分段错误
【发布时间】:2016-11-27 02:27:21
【问题描述】:

我正在做一个测试,在线测试引擎显示分段错误,这令人困惑,因为没有进一步的细节,我检查了指针没有 NULL,它们工作得很好,但是 array 这里有效。因为在调试时,一切都很好,直到我尝试计算/打印出数组。它报告一个在这里被压碎并破裂。如果它中断,我在这里无能为力,我点击中断或继续。如果我继续,它运行得很好。所以我真的很困惑。

我的电脑是 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;

}

它在我的笔记本电脑上完美运行,这令人困惑,因为 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;

}

【问题讨论】:

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


【解决方案1】:

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

int a[len];

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

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

int a* = new int[len];

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

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

delete[] a;

【讨论】:

  • 您好,非常感谢!它现在正在工作,我可以知道关键两行之间的区别吗?我需要删除每个指针吗?
  • @R.mia 这会将数据的放置从自动内存(堆栈)更改为动态内存(堆)。
  • 请问我可以参考的相关文档或链接是什么/
  • @R.mia 这应该包含在您的 C++ 教科书中。查找“动态分配”和“操作员新”。注意运算符delete和运算符delete[]带方括号的区别。
  • @R.mia 是的,您需要删除使用new 分配的所有内容。 Java 的语法从 C++ 中借用了一些东西。除此之外,这两种语言非常不同。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-10-03
  • 1970-01-01
  • 2014-04-28
  • 2013-09-04
  • 1970-01-01
  • 2020-07-17
  • 2013-05-27
相关资源
最近更新 更多