我正在做一个家庭作业,用动态分配的2d数组做矩阵乘法.我编写了以下函数来加载矩阵:
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]);
}
}
}
Run Code Online (Sandbox Code Playgroud)
我将我的矩阵声明为全局变量,如下所示:
int **a;
Run Code Online (Sandbox Code Playgroud)
然后初始化并加载它如下:
// 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);
Run Code Online (Sandbox Code Playgroud)
一切都按预期工作,但老师提供的功能签名如下:
void loadMatrix(FILE*, int ***, int, int);
Run Code Online (Sandbox Code Playgroud)
我尝试使用该签名,并使用&传递矩阵的地址,并从我的loadMatrix函数中删除&,认为输出应该相同,但使用***不能按预期工作.我错过了什么?如果有三指针,那么使用三指针的优势是什么呢?
您的代码存在以下问题:
您不是分配二维数组,而是分配在整个堆上分段的基于指针到指针的查找表。这是很普遍但不好的做法:没有理由对 2D 数组进行分段并将其分配在多个位置。代码变得复杂,程序变得缓慢,但没有任何好处。
没有理由将矩阵声明为全局变量。
在 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);
}
Run Code Online (Sandbox Code Playgroud)
为了充分理解上述内容,我建议研究可变长度数组以及数组如何衰减为指向第一个元素的指针。
| 归档时间: |
|
| 查看次数: |
233 次 |
| 最近记录: |