如何为结构内的矩阵赋值?

时间:2018-04-16 22:30:59

标签: c pointers struct malloc

我有一个带有此类型定义的头文件:

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并进行乘法。

1 个答案:

答案 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); } ,在实践中使用处理器的缓存它应该比第二个实现快得多。