创建矩阵时的分段错误

时间:2011-07-25 11:40:07

标签: c++ matrix

我在c ++上练习一些教程,我在创建矩阵的教程中遇到过,我想要更多内容并修改它,我根本不知道矩阵因为我还没在学校学过它们,但是下面这段代码有时有时不工作。
当它不起作用时,我通常得到:分段错误 为什么会这样?

每次发生之前,但是在我给变量线和成员的0值后,它不会再发生了,但是如果我输入的话 行:10
成员:9

它给出了:

    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 << "\n\n";
         }
 return 0;
 }

5 个答案:

答案 0 :(得分:4)

int line=0,member=0;
int i,j,matrice[line][member];

此行不应编译。在标准C ++中,

  1. 不允许使用0尺寸的数组
  2. 数组大小必须为constant expressions
  3. 您的编译器似乎允许这些作为扩展。在任何情况下,当您稍后输入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;
    

    我建议您阅读a good C++ book

    HTH

答案 1 :(得分:2)

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 ++不允许零大小的数组(无论如何它在你的程序中都没有意义。)

答案 2 :(得分:0)

您正在使用动态数组而不使用malloc或类似内容分配内存。你的行int i,j,matrice[line][member];不是一个大小恒定的数组,因此应该动态分配内存。或者使用恒定的matix大小作为上面提到的海报。

答案 3 :(得分:0)

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

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

g ++ --version

我得到了

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)。

结果如下:

Vectors needed: 24 sec, 624416 usec
Arrays needed:  10 sec, 16970 usec

所以似乎向量确实对数组有一些开销。或者我可以做些什么来改善矢量的性能?我检查了几次我的基准代码,在我看来,我做对了。

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

答案 4 :(得分:-4)

您想要动态分配内存。 然后,使用动态分配,如下所示:

 #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 << "\n\n";
         }
 delete[] matrice;  //Releasing allocated memory
 return 0;
 }