【发布时间】:2014-04-16 18:34:25
【问题描述】:
我想创建一个矩阵结构,其行数不均匀,如下所示:
[0] [0]
[0] [0] [0]
[0] [0] [0] [0]
[0] [0] [0] [0] [0]
[0] [0] [0] [0]
因此,我想在某处存储它的列长度以及每行的宽度。我的实现是这样的:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
typedef struct {
size_t size;
int *data;
} dyn_row;
typedef struct {
size_t size;
dyn_row *row;
} dyn_matrix;
int main(void) {
int i, j;
dyn_matrix matrix;
srand(time(NULL));
// Allocate
matrix.size = 5;
matrix.row = malloc(matrix.size * sizeof(dyn_row));
for (i=0; i<matrix.size; i++) {
matrix.row[i].size = rand()%(i+1)+2;
matrix.row[i].data = malloc((matrix.row[i].size) * sizeof(int));
}
// Initialize
for (i=0; i<matrix.size; i++) {
for (j=0; j<matrix.row[i].size; j++) {
matrix.row[i].data[j] = 0;
}
}
// Print values & free
for (i=0; i<matrix.size; i++) {
for (j=0; j<matrix.row[i].size; j++) {
printf("[%d] ", matrix.row[i].data[j]);
}
printf("\n");
free(matrix.row[i].data);
}
free(matrix.row);
return 0;
}
这是一个好的解决方案吗?解决这个问题的最佳实现是什么?另外,用“void *data”代替“int *data”是否是一种好习惯,这样矩阵可以保存任何类型的数据?
【问题讨论】:
-
你所拥有的是一个合理的解决方案。如果您只关心
int的数组,则使用int *比使用void *更好。如果您知道要存储其他类型,那么void *解决方案可以让某些事情起作用,但取消引用数据将是一个涉及强制转换的繁琐过程。一般来说,您最好使用准确的具体类型,而不是尝试void *。此外,对单元格 (i,j) 的随机访问需要检查。 -
询问一个可行的解决方案是否是一个好的解决方案可能应该发布在Code Review instead of 这里(如果你还没有测试过,你应该在发布之前这样做)。 “最优”是哪方面的?空间?时间?代码的可读性?
voidpointers 有这种将编译时错误转化为运行时错误的习惯,这是一件坏事,并且会影响代码的可读性(所以应该尽可能避免)。 -
这个问题似乎离题了,因为它是一个代码审查并且属于codereview.stackexchange.com而不是SO。
标签: c data-structures matrix struct