【问题标题】:Segmentation fault two dimensional array分段错误二维数组
【发布时间】:2016-03-31 04:57:07
【问题描述】:

我是编程新手,我正在尝试理解二维数组。我写这段代码只是为了测试我的代码,看看它是否工作。不幸的是,我遇到了分段错误。我知道这意味着我写的东西对于编译器来说是不可读的,但我不知道它是什么。因为在我看来一切都很好。

#include<iostream>


using namespace std;


int main(){

   int col, row,i;
   int **array;

   cout << "How many rows?\n";
   cin >> row;
   cout << "How many colomns\n";
   cin >> col;

cout << "!!!!!!!!!!!!";

   array = new int*[row];
   for (int i = 0;i<row;i++){
          array[i] = new int[col];
   }   

        cout << "!!!!!!!!!!!!";

   for( i=0; i<row; i++){
        int x=1;
      array[0][i]= x;; 
   x++;
   }   
        cout << "!!!!!!!!!!!!";
   cout << array[row][col];

   for(i=0; i<row; i++){

   delete [] array[i];
   delete [] array;
   }   
   return 0; 
}

错误是: " 多少行? 3 多少列 3 分段错误(核心转储) "

【问题讨论】:

  • cout &lt;&lt; array[row][col]; 超出范围。 array[row-1][col-1] 尽你所能。
  • x++;什么都不做; x 在每次循环迭代结束时超出范围,并在下一次迭代开始时重新创建。
  • 现在我们在 C++ 中很少使用指针和数组以及 new 和 deete。有更健康的选择,例如 std::vector 和 std::shared_ptr。

标签: c++


【解决方案1】:

array[0][i]= x; 看起来不对。应该是:

array[i][0]= x;

第一个索引用于行,第二个用于列。

后来cout &lt;&lt; array[row][col]; 也因row 超出范围而被拧紧。

你删除数组的方式也是错误的,应该是:

for(i=row - 1; i >= 0; --i){
  delete [] array[i];
}
delete [] array;

【讨论】:

  • 所以应该是这样的?
【解决方案2】:
cout << array[row][col];

正如其他人所说,两个维度中的每一个都超出了范围。

for(i=0; i<row; i++){

delete [] array[i];
delete [] array;
}

您将删除数组的元素三次,每个元素一次。这很好。您还要删除数组本身三次。这是危险和错误的。

【讨论】:

    【解决方案3】:

    所以它应该是这样的?

    #include<iostream>
    
    
    using namespace std;
    
    
    int main(){
    
       int col, row,i;
       int **array;
    
       cout << "How many rows?\n";
       cin >> row;
       cout << "How many colomns\n";
       cin >> col;
    
       array = new int*[row];
       for (int i = 0;i<row;i++){
              array[i] = new int[col];
       }   
    
            cout << "!!!!!!!!!!!!";
    
       for( i=0; i<row; i++){
            int x=1;
          array[i][0]= x;; 
       x++;
       }   
            cout << "!!!!!!!!!!!!";
       for(i=0; i<row; i++){
            for(int j=0; j<col; j++){
               array[i][j];
            }   
       }   
        cout << array[row][col];    
    
       for(i=0; i<row; i++){
    
       delete [] array[i];
       delete [] array;
       }   
       return 0;
    }
    

    【讨论】:

    • x++;和数组[i][j];什么都不做,但它们也不会伤害任何东西。删除[] 数组;仍然错误地运行了 3 次(假设行是 3)。否则我看不出有什么问题,虽然我没有通过运行代码来确认。
    【解决方案4】:

    此行超出范围cout &lt;&lt; array[row][col];。如果要打印最后一个元素,则将此行更改为cout &lt;&lt; array[row-1][col-1];

    正如其他人提到的,下面是删除分配内存的代码

    for(i=0; i <row; i++){
        delete [] array[i];       
    }
    delete [] array;
    

    同样在你下面的代码中 x 总是会是 1x++ 是无效的。

    for( i=0; i<row; i++){
     int x=1;      
     array[0][i]= x; 
     x++;
    }
    

    如果您想为每一行增加x,则在循环外初始化x 像这样

    int x=1; 
    for( i=0; i<row; i++){     
      array[0][i]= x;; 
      x++;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-11
      • 1970-01-01
      • 2019-08-03
      • 2016-05-07
      • 2015-11-11
      • 2011-10-12
      相关资源
      最近更新 更多