创建矩阵时出现分割错误

Segmentation fault on creating matrices

本文关键字:分割 错误 创建      更新时间:2023-10-16

我在一些教程上练习c++,我遇到了一个创建矩阵的教程,我想从它那里得到更多的东西,我修改了它,我根本不知道矩阵,因为我还没有在学校学习它们,但下面的代码有时工作有时不。
当它不工作时,我通常得到:分割错误。
为什么会这样呢?

之前每次都发生但是在我给变量line和成员赋0值之后它就不再发生了,但是如果我输入exc
第一行:10
成员:9

它给出:

1 1 1 1 1 1 1 1 1 1 1

1 2 3 4 5 1 7 8 9
分割故障
斯特普。
谁能给我解释一下这个?
谢谢!

 #include <iostream>
 #include <iomanip>
 using namespace std;
 int main()
 {
     int line=0,member=0;
     int i,j,matrice[line][member];
     cout << "nLine: ";
         cin >> line;
     cout << "Member: ";
     cin >> member;
     cout << "nCreated Matrice: n" << endl;
         for (i=0;i<line;i++)
         {
             for (j=0;j<member;j++)
             {
                 matrice[i][j]=i*j+1;
                 cout << setw(5) << matrice[i][j];
             }
             cout << "nn";
         }
 return 0;
 }
int line=0,member=0;
int i,j,matrice[line][member];

这行不能编译。在标准c++中,


  1. 数组大小必须为常量表达式

看来你的编译器允许这些扩展。在任何情况下,当你以后输入linemember,你的数组大小不会改变。您应该在输入这些数字之后定义您的数组。但是数组必须动态分配(最好使用vector s)

#include <vector>
//...
int line, member;
cin >> line  >> member;
vector<vector<int> > matrix(line, vector<int>(member));

或者如果你不想把vector用于教育目的,这样做:

int line, member;
int ** matrix;
cin >> line  >> member;
matrix = new int*[line];
for(int i = 0; i < line; ++i)
   matrix[i] = new int[member];

别忘了释放矩阵

for(int i = 0; i < line; ++i)
   delete [] matrix[i];
delete [] matrix;

我建议你读一本好的c++书

HTH

matrice数组初始化大小为[0][0],即linemember的值。因为您用输入的值覆盖了这些值,所以for循环中使用的边界是无效的。

。你正在访问数组边界之外的项。

你可以使用new动态创建数组,或者只使用std::vector自行调整大小。

同样,它不是标准的,但是如果你的编译器支持它,你可以使用变长数组。它们的行为类似于常规数组,但使用运行时计算的值进行分配:

int line=0,member=0;
int i,j;
cout << "nLine: ";
cin >> line;
cout << "Member: ";
cin >> member;
int matrice[line][member];

您还应该检查输入的值,因为c++不允许零大小的数组(而且它在您的程序中也没有意义)

您正在使用动态数组而没有使用malloc或类似的内存分配。这是在您的行int i,j,matrice[line][member];不是一个常量大小的数组,因此内存应该动态分配。或者像上面海报建议的那样使用一个固定的矩阵大小。

我同意其他评论,使用向量是一个更安全的方式来解决你的问题:直接使用数组肯定是容易出错的。当然,如果您的练习需要使用数组,那么您应该使用数组。

关于性能,我在Ubuntu 10.04上用g++写了一个小测试。运行

g++ -版本

g++ (Ubuntu 4.4.3-4ubuntu5) 4.4.3

我的测试程序创建了一个100x100的矩阵,并将每个元素设置为某个值。它首先有一些声明:

#include <vector>
#include <iostream>
#include "util.h" // Timer utilities.
#define LINE_COUNT (100) // The number of lines.
#define COL_COUNT (100) // The number of columns.
#define REPETITIONS (100000) // Number of repetitions for each test.
using namespace std;

然后我使用向量进行测试:

void use_vectors()
{
  int line   = LINE_COUNT;
  int member = COL_COUNT;
  vector<vector<int> > matrix(line, vector<int>(member));
  // Set data.
  for (int i = 0; i < line; i++)
  {
    for (int j = 0; j < member; j++)
    {
      matrix[i][j] = -5;
    }
  }
}

然后我有一个函数来执行相同的测试(创建矩阵和设置值)使用数组:

void use_arrays()
{
  int line   = LINE_COUNT;
  int member = COL_COUNT;
  int **matrix; 
  matrix = new int * [line];
  for (int i = 0; i < line; i++)
  {
     matrix[i] = new int[member];
  }
  // Set data.
  for (int i = 0; i < line; i++)
  {
    for (int j = 0; j < member; j++)
    {
      matrix[i][j] = -5;
    }
  }
  for (int i = 0; i < line; ++i)
  {
     delete [] matrix[i];
  }
  delete [] matrix;
}

主程序重复这两个测试,并记录每个测试所需的时间。下面是主程序:

main()
{
  long int es = 0;
  long int eu = 0;
  start_timer();
  for (int i = 0; i < REPETITIONS; i++)
  {
    use_vectors();
  }
  stop_timer();
  es = elapsed_sec();
  eu = elapsed_usec();
  cout << "Vectors needed: " << es << " sec, " << eu << " usec" << endl;
  start_timer();
  for (int i = 0; i < REPETITIONS; i++)
  {
    use_arrays();
  }
  stop_timer();
  es = elapsed_sec();
  eu = elapsed_usec();
  cout << "Arrays needed: " << es << " sec, " << eu << " usec" << endl;
}

计时器函数基于库函数gettimeofday()(参见例如http://linux.die.net/man/2/gettimeofday)。

结果如下:

<>之前所需向量:24秒,624416次使用需要的数组:10秒,16970使用秒之前

所以看起来向量和数组相比确实有一些开销。或者我能做些什么来提高向量的性能?我检查了我的基准代码几次,在我看来,我得到了正确的。

无论如何,我绝不建议仅仅为了获得性能而使用数组,除非它真的对你的应用程序有很大的影响。

您希望动态分配内存。然后,像这样使用动态分配:

 #include <iostream>
 #include <iomanip>
 using namespace std;
 int main()
 {
     int line=0,member=0;
     int i,j;
     int **matrice; //Define matrice as a 2D array(a Matrix)
     cout << "nLine: ";
         cin >> line;
     cout << "Member: ";
     cin >> member;
     //start of dynamic allocation
     matrice=new int*[line];
     for (i=0;i<line;i++)
           matrice[i]=new int[member];
     //End of dynamic allocation
     cout << "nCreated Matrice: n" << endl;
         for (i=0;i<line;i++)
         {
             for (j=0;j<member;j++)
             {
                 matrice[i][j]=i*j+1;
                 cout << setw(5) << matrice[i][j];
             }
             cout << "nn";
         }
 delete[] matrice;  //Releasing allocated memory
 return 0;
 }