作者热门文章
- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我正在做一个家庭作业,用动态分配的二维数组做矩阵乘法。我编写了以下函数来加载矩阵:
void loadMatrix(FILE* fp, int** matrix, int rowSize, int colSize) {
for (int i = 0; i < rowSize; i++) {
for (int j = 0; j < colSize; j++) {
fscanf(fp, "%d", &matrix[i][j]);
}
}
}
我将矩阵声明为全局变量,如下所示:
int **a;
然后初始化加载如下:
// allocate memory for the array rows
a = (int **) malloc(m * sizeof(int*));
// allocate memory for array columns
for (int i = 0; i < m; i++) {
a[i] = malloc(k * sizeof(int));
}
loadMatrix(fp, a, m, k);
一切都按预期工作,但是老师提供的函数签名如下:
void loadMatrix(FILE*, int ***, int, int);
我尝试使用该签名,并使用 & 传递矩阵的地址,并从我的 loadMatrix 函数中删除 &,认为输出应该相同,但使用 *** 并没有按预期工作。我错过了什么?如果有的话,使用三重指针还有什么好处?
最佳答案
您的代码存在以下问题:
您不是在分配二维数组,而是在整个堆上分段的基于指针到指针的查找表。这是一种普遍但不好的做法:永远没有理由将二维数组分段并将其分配到多个位置。代码变得复杂,程序变得缓慢,没有任何好处。
没有理由将矩阵声明为全局变量。
C 语言中没有理由采用 3 级间接寻址。这被称为“三星级编程”,是程序设计存在根本性缺陷的某种标志。不幸的是,这意味着您的老师不是 C 知识的可靠来源。
相反,您应该分配二维数组:
#include <stdio.h>
#include <stdlib.h>
void loadMatrix(FILE* fp, int rowSize, int colSize, int matrix[rowSize][colSize])
{
for (int i = 0; i < rowSize; i++) {
for (int j = 0; j < colSize; j++) {
fscanf(fp, "%d", &matrix[i][j]);
}
}
}
int main (void)
{
const int ROWS = 4;
const int COLS = 5;
int (*matrix)[ROWS][COLS]; // array pointer to variable-length array
matrix = malloc( sizeof(int[ROWS][COLS]) );
if(matrix == NULL)
{
// error handling
}
FILE* fp = ...;
loadMatrix(fp, ROWS, COLS, *matrix); // contents of what the pointer points at is the array
free(matrix);
}
要完全理解上述内容,我建议研究可变长度数组以及数组如何衰减为指向第一个元素的指针。
关于c - 在二维矩阵的上下文中 C 中 ** 和 &** 之间的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35546398/
我是一名优秀的程序员,十分优秀!