二维数组 C++ 的分段错误
Segmentation fault error with 2D arrays C++
我不知道为什么在尝试设置或从创建的数组中获取任何元素时出现分段错误!
这里符合A[0][0] = 1;
我正在使用 g++ 9.3.0。我做错了什么?
#include <iostream>
#define SIMULATIONS 30
using namespace std;
void init_matrixes(int a_rows, int b_cols, int vec_len, double **A, double **B, double **C)
{
A = new double *[a_rows];
B = new double *[vec_len];
C = new double *[a_rows];
for (int i = 0; i < a_rows; i++)
{
A[i] = new double[vec_len];
C[i] = new double[b_cols];
}
for (int i = 0; i < vec_len; i++)
B[i] = new double[b_cols];
}
int main()
{
double s;
int t1, t2, a_rows, b_cols, vec_len;
for (auto v : {50, 100})
{
a_rows = v;
b_cols = v;
vec_len = v;
for (int i = 0; i < SIMULATIONS; i++)
{
double **A, **B, **C;
init_matrixes(a_rows, b_cols, vec_len, A, B, C);
A[0][0] = 1; // error here
}
std::cout << "size = " << v<< " time = " << s / SIMULATIONS << endl;
}
return 0;
}
TL;DR 版本
使用std::vector
or a matrix class like the one described here. This will eliminate the need for special allocation and deallocation functions thanks to the magic of RAII.
出了什么问题?
指针只是另一个变量,但可以包含另一个对象的位置。与任何其他变量一样,指针将按值传递给函数并默认复制。指向的对象是按引用传递的(通过指针的方式),但是指针本身是按值传递的。
double **A
将 A
定义为指向 double
的指针,后者是调用者提供的指针的副本。
A = new double *[a_rows];
更新副本,调用者none更聪明。结果,所有分配的内存都在函数末尾泄漏,因为本地 A
超出范围。
那我该如何解决呢?
通过引用传递指针。
void init_matrixes(int a_rows,
int b_cols,
int vec_len,
double ** & A,
double ** & B,
double ** & C)
A
、B
、C
是通过引用传递的(这次是引用),不再是副本。
A = new double *[a_rows];
更新调用者提供的指针,调用者现在有一个指向有效存储的指针。
我不知道为什么在尝试设置或从创建的数组中获取任何元素时出现分段错误!
这里符合A[0][0] = 1;
我正在使用 g++ 9.3.0。我做错了什么?
#include <iostream>
#define SIMULATIONS 30
using namespace std;
void init_matrixes(int a_rows, int b_cols, int vec_len, double **A, double **B, double **C)
{
A = new double *[a_rows];
B = new double *[vec_len];
C = new double *[a_rows];
for (int i = 0; i < a_rows; i++)
{
A[i] = new double[vec_len];
C[i] = new double[b_cols];
}
for (int i = 0; i < vec_len; i++)
B[i] = new double[b_cols];
}
int main()
{
double s;
int t1, t2, a_rows, b_cols, vec_len;
for (auto v : {50, 100})
{
a_rows = v;
b_cols = v;
vec_len = v;
for (int i = 0; i < SIMULATIONS; i++)
{
double **A, **B, **C;
init_matrixes(a_rows, b_cols, vec_len, A, B, C);
A[0][0] = 1; // error here
}
std::cout << "size = " << v<< " time = " << s / SIMULATIONS << endl;
}
return 0;
}
TL;DR 版本
使用std::vector
or a matrix class like the one described here. This will eliminate the need for special allocation and deallocation functions thanks to the magic of RAII.
出了什么问题?
指针只是另一个变量,但可以包含另一个对象的位置。与任何其他变量一样,指针将按值传递给函数并默认复制。指向的对象是按引用传递的(通过指针的方式),但是指针本身是按值传递的。
double **A
将 A
定义为指向 double
的指针,后者是调用者提供的指针的副本。
A = new double *[a_rows];
更新副本,调用者none更聪明。结果,所有分配的内存都在函数末尾泄漏,因为本地 A
超出范围。
那我该如何解决呢?
通过引用传递指针。
void init_matrixes(int a_rows,
int b_cols,
int vec_len,
double ** & A,
double ** & B,
double ** & C)
A
、B
、C
是通过引用传递的(这次是引用),不再是副本。
A = new double *[a_rows];
更新调用者提供的指针,调用者现在有一个指向有效存储的指针。