我有一个一维数组int *data
,我知道在其中实际存储了rows
和cols
的数量。也就是说,我可以使用data[i*cols+j]
来访问二维矩阵中的元素(i,j)
。
具体来说,这些数据被存储在一个结构体中:
typedef struct {
int *data;
int rows;
int cols;
} matrix_t;
在过去的某个时间点,我也写过这段巫术代码:
#define MATRIXP(m) __typeof__(__typeof__(__typeof__(*((m).data))[(m).cols]) *)
#define MATRIXD(m) ((MATRIXP(m)) ((m).data))
有了这些定义,我能做到:
MATRIXP(matrix) m = MATRIXD(matrix);
然后我可以使用矩阵m
作为一个二维矩阵指针来访问data
。
m[3][2] = 5; /* assign the element in row 3 and column 2 */
这很好,意味着我不需要记住总是要使用类似于data[i*cols+j]
的表达式。然而,我之前写了这段代码,现在我想不起来它是如何工作的。
有人可以解释一下所有那些
__typeof__
运算符是如何工作的,以及如何阅读类似的表达式吗?变量m
的类型是什么?我知道它会扩展成类似于:
__typeof__(__typeof__(__typeof__(*((matrix).data))[(matrix).cols]) *) m = ((__typeof__(__typeof__(__typeof__(*((matrix).data))[(matrix).cols]) *)) ((matrix).data));
访问数据的这种方法安全吗?这是最好的方式吗?
c99
及更高版本允许您为多维数组分配连续的内存,例如int (*data)[cols] = malloc(sizeof(int[rows][cols]));
。我的意思是,您所做的很好,但似乎有更好的方法。 - Daboint(*data)[cols] = malloc(sizeof(int)*rows*cols);
。 - Lundinint (*data)[cols]
这样的字段。我并不是真正询问如何在使用它的同一作用域中分配这样的东西。我需要能够将其传递给其他函数并轻松访问它。 - codebeard