我在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;
}
答案 0 :(得分:4)
int line=0,member=0;
int i,j,matrice[line][member];
此行不应编译。在标准C ++中,
您的编译器似乎允许这些作为扩展。在任何情况下,当您稍后输入line
和member
时,您的数组大小不会更改。输入这些数字后,您应该定义数组。但是必须动态分配数组(更好的是,使用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]
,其大小为line
和member
。由于您使用输入的值覆盖值,因此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;
}