我有一个带有此类型定义的头文件:
typedef struct {
int rows;
int columns;
int **values;
} bidimensional_matrix;
作为一个例子,如果我从主函数中实例化矩阵,我只会这样做:
int matrix[][] = {{1, 2, 3}, {1, 1, 1}, {5, 5, 5}};
如何使用之前提供的typedef生成相同的矩阵? (我的意思是,使用指针和malloc)
方法是否正确?也许我是一个有点面向对象的偏见,而且用这种方式来处理它并不方便。我已经定义了结构,所以我可以通过参数传递两个bidimensional_matrix
并进行乘法。
答案 0 :(得分:1)
我建议你使用灵活的成员数组,例如:
\Z
但你也可以使用它,它有其他优点,但通常更慢:
#include <stdio.h>
#include <stdlib.h>
typedef struct {
size_t n;
size_t m;
int matrix[];
} bidimensional_matrix;
bidimensional_matrix *new_bidimensional_matrix(size_t n, size_t m) {
bidimensional_matrix *bm = malloc(sizeof *bm + sizeof *bm->matrix * n * m);
if (!bm) {
return NULL;
}
*bm = (bidimensional_matrix){ .n = n, .m = m };
return bm;
}
int get_bidimensional_matrix(bidimensional_matrix *bm, size_t i, size_t j) {
return bm->matrix[i * bm->m + j];
}
int set_bidimensional_matrix(bidimensional_matrix *bm, size_t i, size_t j, int x) {
return bm->matrix[i * bm->m + j] = x;
}
int main(void) {
bidimensional_matrix *bm = new_bidimensional_matrix(5, 10);
if (!bm) {
return EXIT_FAILURE;
}
for (size_t i = 0; i < bm->n * bm->m; i++) {
bm->matrix[i] = i;
}
printf("sample value %d\n", get_bidimensional_matrix(bm, 4, 5));
set_bidimensional_matrix(bm, 4, 5, 42);
printf("sample value %d\n", get_bidimensional_matrix(bm, 4, 5));
free(bm);
}
如果你需要交换行,第二行可能会快一点,因为交换行是O(1)。但是就像你看到第一个只有一个#include <stdio.h>
#include <stdlib.h>
typedef struct {
size_t n;
size_t m;
int **matrix;
} bidimensional_matrix;
int main(void) {
bidimensional_matrix bm = { .n = 5, .m = 10, .matrix = malloc(sizeof *bm.matrix * bm.n) };
if (!bm.matrix) {
return EXIT_FAILURE;
}
for (size_t i = 0; i < bm.n; i++) {
bm.matrix[i] = malloc(sizeof *bm.matrix[i] * bm.m);
if (!bm.matrix[i]) {
return EXIT_FAILURE;
}
for (size_t j = 0; j < bm.m; j++) {
bm.matrix[i][j] = i * bm.m + j;
}
}
printf("sample value %d\n", bm.matrix[4][5]);
for (size_t i = 0; i < bm.n; i++) {
free(bm.matrix[i]);
}
free(bm.matrix);
}
,在实践中使用处理器的缓存它应该比第二个实现快得多。