【发布时间】:2014-06-16 09:28:40
【问题描述】:
我有一个一维数组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)); 这种访问
data的方法安全吗?这是最好的方法吗?
【问题讨论】:
-
+1,但是你知道
c99和更高版本允许你为像int (*data)[cols] = malloc(sizeof(int[rows][cols]));这样的多暗淡数组分配连续内存,我的意思是你做的很好,但看起来有更好的方法。 -
在 C99 之前的版本中,您仍然可以使用
int(*data)[cols] = malloc(sizeof(int)*rows*cols);。 -
您不能在结构定义中放置像
int (*data)[cols]这样的字段。我并不是真的在问如何在它使用的同一范围内分配这样的东西。我需要能够将它传递给其他函数并轻松访问它。
标签: c arrays matrix multidimensional-array typeof