我试图理解一段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创建了一个1-d数组(size=100)指向double的指针。我不明白malloc又发生了什么?两个这样的表述有必要吗?
是否有其他方法可以实现上面最后两行代码中发生的事情?
宏的计算结果为:
double (*f)[my];
是指向双精度数组的指针,而不是指向双精度指针的数组。
malloc
分配2 * mx * <whatever
f points to>
的数组(即双精度数组)。不确定为什么它会分配两倍于mx
给出的条目,但这就是它所做的。
f
指向之后的第一个双精度数组。它有效地分配了一个true二维数组。(不是经常混淆的指向双精度指针的数组)。注意malloc
的强制转换在c中是不好的做法。
注释:由于没有减少输入,宏没有添加特定的信息,这实际上是不好的做法。更糟糕的是,它隐藏了指针语义,混淆了代码。建议不要使用,但最好是明确的;这甚至不是更多的输入。
Update:如果sizeof(*f)
呈现未定义行为,当前有一个参数, because
f '在这里未初始化使用。虽然我在这里看到了标准中的一个缺陷,它应该更精确,但您可能最好安全地使用显式表达式:
f = malloc (2 * mx * my * sizeof (double))
double (*f)[my]
是VLA类型,因为my
是int
。所以sizeof (*f)
导致未定义的行为,因为如果sizeof
的参数是VLA类型,则对其进行评估。更多讨论见这里。
不幸的是,sizeof *f
习惯用法只能用于指向固定维数数组的指针(或指向非数组的指针!)。所以整个想法都是假的。
恕我直言,去掉宏并写:
更简单、更清晰。double (*f)[my] = malloc( sizeof(double[mx][my]) );