SIGSEGV,使用数组的分段错误
SIGSEGV, Segmentation fault using array
我在运行程序时遇到分段错误,并且还得到了一个奇怪的结果。我已经投入了很多调试代码来准确找到奇怪行为的位置。
int det_2b2(int d[2][2])
{
cout<<d[1][1]<<","<<d[1][2]<<endl;
cout<<d[2][1]<<","<<d[2][2]<<endl;
cout<<(d[1][1]*d[2][2]-d[1][2]*d[2][1])<<endl;
return (d[1][1]*d[2][2]-d[1][2]*d[2][1]);
}
int det_3b3(int d3[3][3])
{
int r1;
int x[2][2];
x[1][1]=d3[2][2];
x[1][2]=d3[2][3];
x[2][1]=d3[3][2];
x[2][2]=d3[3][3];
cout<<"r1.1="<<det_2b2(x)<<endl;
r1=det_2b2(x);
cout<<"r1.2="<<r1<<endl;
x[1][1]=d3[2][1];
x[2][2]=35;
cout<<"r1.3="<<r1<<endl;
x[1][2]=d3[2][3];
cout<<"r1.4="<<r1<<endl;
x[2][1]=d3[3][1];
cout<<"r1.5="<<r1<<endl;
x[2][2]=d3[3][3];
cout<<"r1.6="<<r1<<endl;
int r2=det_2b2(x);
x[1][1]=d3[2][1];
x[1][2]=d3[2][2];
x[2][1]=d3[3][1];
x[2][2]=d3[3][2];
int r3=det_2b2(x);
cout<<r1<<endl;
cout<<d3[1][1]<<endl;
cout<<r1*d3[1][1]<<endl;
cout<<r2*d3[1][2]<<endl;
cout<<r3*d3[1][3]<<endl;
return r1*d3[1][1]-r2*d3[1][2]+r3*d3[1][3];
}
当我设置 x[2][2] = 35 或 x[2][2]= d[3][3] 的值时,它会将 r1 的值更改为 35 或更改为 d[3][3] 中的值,因此在幕后肯定有问题。调用程序是
#include <iostream>
#include "utilities.h"
using namespace std;
int main()
{
int a[3][3];
a[1][1] = 1;
a[1][2] = 2;
a[1][3] = 3;
a[2][1] = 4;
a[2][2] = 5;
a[2][3] = 6;
a[3][1] = 7;
a[3][2] = 8;
a[3][3] = 9;
cout << "DET a= " << det_3b3(a)<<endl;
return 0;
}
分段错误发生在程序错误发生后很久的调用程序结束时。
有什么想法吗?
C++中的数组是从0
索引的,而不是1
。例如,任何对a[x][3]
的访问都是越界的,main
,都是越界的。
只需从所有索引中减去1
,它就可以编译,但您应该阅读一本介绍性C++书,并了解循环和聚合初始化。
当你声明一个大小为 nXn
的数组时,可能的索引是从 (0,0) 到 (n-1,n-1)。
因此
a[1][1]
应该是a[0][0]
的,依此类推。
所以最后一个元素将是a[2][2]
(对于 3 X 3 矩阵),而不是a[3][3]
相关文章:
- 在某些循环内使用vector.push_back时出现分段错误
- 为什么在运行时没有向我们提供有关分段错误的更多信息?
- 如何解决gcc编译器优化导致的centos双编译器设置中的分段错误
- 当我的阵列太大时出现分段错误
- 分段错误当我试图运行程序时出错
- 在c++中初始化矩阵时出现分段错误(核心转储)
- 尝试使用集合函数时出现分段错误
- 我无法缩小此分段错误的原因
- g++的分段错误(在NaN上使用to_string两次时)
- 我是如何在这段代码中出现分段错误的
- 创建结构的数组时遇到分段错误
- 在c++中键入向量中的所有值后,得到分段错误(核心转储)
- 在 c++ 中实现 Trie 时出现分段错误
- 为什么 fstream 在打开带有格式的文件时会导致分段错误?
- 为什么我遇到分段错误?
- 动态类的分段错误(家庭作业问题)
- 分段错误 - 读取初始化指针的数组
- 如何摆脱C ++中的分段错误错误?
- 使用 CTYPE 时出现分段错误
- 为什么代码给出分段错误?