【问题标题】:c++ dynamic array initialization crashc++动态数组初始化崩溃
【发布时间】:2013-10-20 15:59:45
【问题描述】:

我有以下代码,我在其中调用一个函数并创建一个动态整数数组,然后用算法填充该数组

ma​​in.cpp

...
int main(void){

    srand((long) 1234567);

    callFunction1();

    return 0;

}

functions.h

...
    int *A;
    int N;

    //prototype
    void callFunction2();

    void callFunction1(){

         int choice;
         cin >> choice;

         while (choice != 2){

               callFunction2();

               cin >> choice;
         }

    }

    void callFunction2(){

         cout << "Enter array size" << endl;
         cin >> N;

         A = new int[N];
         A[0] = 0;
         A[1] = 1;

         for (int i=2;i<=N;i++){
             A[i] = A[i-1] + A[i-2];
         }

    }

所以上面的代码大部分时间都可以工作,但有时它会在我初始化数组的那一行崩溃

A = new int[N];

这个问题的原因可能是什么?

【问题讨论】:

  • 你的“数组”超出了范围。
  • 您要么为 N 输入一个小于或等于 1 的数字,要么为 N 输入一个大到分配数组会消耗超过可用内存的数字(请注意可能的内存碎片,也)。

标签: c++ arrays crash dynamic-arrays


【解决方案1】:

您在此处越界访问A

for (int i=2;i<=N;i++){
         A[i] = ....

A 只能从 0N-1 进行索引,即在 [0, N) 范围内。

【讨论】:

  • 这就是我得到的... Αi = Ai-1 + Ai-2 for i = 2...n
  • @fxuser 这是错误的,可能会导致分段违规。所以修复它。您必须区分刚刚发布的表达式和数组的索引。
  • @fxuser 将 for 循环的条件更改为 i &lt; N 会更有意义。
【解决方案2】:

您在 callFunction2 中也有内存泄漏。

【讨论】:

  • 因为最后忘记删除数组了?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-09-04
  • 1970-01-01
  • 2021-09-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多