创建矩阵时出现分割错误
Segmentation fault on creating matrices
我在一些教程上练习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++中,
- 数组大小必须为常量表达式
看来你的编译器允许这些扩展。在任何情况下,当你以后输入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;
我建议你读一本好的c++书
HTH
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++不允许零大小的数组(而且它在您的程序中也没有意义)
您正在使用动态数组而没有使用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;
}
- C++映射分割错误(核心转储)
- 由cin中的字符串中未捕获空白引起的分割错误
- 删除映射和分割错误中的一个过去结束元素
- 在指向函数中读取变量时出现分割错误
- 在链表中的第 n 位插入显示分割错误
- 较高值 n 的分割错误(例如 n=999997)
- 尝试通过memcpy复制大尺寸浮点向量时的分割错误
- 分割错误:向量中的擦除功能
- 向量向量的分割错误
- 我在C++中编写了一个方法来打印树类的预序,但它显示了分割错误
- C ++分割错误,为什么使用"long long"我没有得到答案?
- 在尝试使用递归查找集合子集的总数时,我遇到了分割错误
- 分割错误 11:尝试使用 cin 输入 B[1] 时
- 集合布局上的 Qt 分割错误
- 高达20亿的筛子会产生分割错误
- 对向量使用推回函数时的分割错误
- 绘制精灵会导致分割错误
- 将矢量的整数内容打印为字符串会导致分割错误
- 分割错误:使用向量时为 11 c++
- 结构的分割错误错误