这里我只想定义一个函数,它返回矩阵的乘法,N任意,我想生成一个带new命令的矩阵.当我执行该函数时,我得到错误:
Segmentation fault (core dumped)
Run Code Online (Sandbox Code Playgroud)
每当我分配值给C我有这个错误时,有人能告诉我发生了什么以及如何解决它?
int **multiply(int **A, int **B, int N){
int **C = new int*[N];
for (int i = 0; i < N; i++) {
for (int j = 0; j < N; j++) {
for (int k = 0; k < N; k++)
C[i][j] = C[i][j] + A[i][k] * B[k][j];
}
}
return (C);
}
Run Code Online (Sandbox Code Playgroud)
将矩阵作为指针的指针并不是一个好主意.要做到这一点,你需要一个相当复杂的:
int **C = new int*[N];
for(int i = 0; i < N; ++ i)
C[i] = new int[M];
Run Code Online (Sandbox Code Playgroud)
释放它是一个类似的复杂过程.还要考虑如果其中一个operator new失败并且您想要释放部分分配的矩阵会发生什么.
将2D阵列存储在1D阵列中是一种惯例.你可以做:
int *C = new int[M * N];
Run Code Online (Sandbox Code Playgroud)
然后访问元素:
C_ij = C[i + N * j];
Run Code Online (Sandbox Code Playgroud)
或作为:
C_ij = C[j + M * i];
Run Code Online (Sandbox Code Playgroud)
间隔在哪里i,在间隔中.这些实际上非常类似于编译器生成对常量大小的2D数组的访问(因此乘法实际上并不是过于昂贵,并且在考虑缓存时,整个事情可能比您的数组阵列快得多).上面两行之间的区别在于一个是列主要的(列的元素在展开到1D时是连续的项目)或者是行主要的.这是一个惯例问题.默认的"C"数组将是row-major.一些库,例如OpenGL或Eigen使用列专业.[0, N)j[0 to M)