我正在尝试理解一段C代码,如下所示:
#define DIM2( basetype, name, w1 ) basetype (*name)[w1]
int mx = 10; //number of rows per processor
int my = 100; //number of cols
DIM2 (double, f, my);
f = (typeof (f)) malloc (2 * mx * sizeof (*f));
如果我是正确的,使用DIM2会创建一个(double = 100)指针加倍的数组。 我无法理解malloc会再次发生什么?两个这样的陈述是否有必要?
有没有其他方法可以用其他任何方式实现上面最后两行代码中发生的事情?
答案 0 :(得分:0)
double (*f)[my]
是VLA类型,因为my
是int
。因此sizeof (*f)
会导致未定义的行为,因为sizeof
的参数在具有VLA类型时会被评估。 For more discussion see here
不幸的是,sizeof *f
成语只能用于指向固定维度数组的指针(或指向非数组的指针!)。所以这整个想法都是假的。
恕我直言,取消宏并写下更简单明了:
double (*f)[my] = malloc( sizeof(double[mx][my]) );