C语言 Confusion with malloc



我试图理解一段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类型,因为myint。所以sizeof (*f)导致未定义的行为,因为如果sizeof的参数是VLA类型,则对其进行评估。更多讨论见这里。

不幸的是,sizeof *f习惯用法只能用于指向固定维数数组的指针(或指向非数组的指针!)。所以整个想法都是假的。

恕我直言,去掉宏并写:

更简单、更清晰。
double (*f)[my] = malloc( sizeof(double[mx][my]) );

相关内容

  • 没有找到相关文章

最新更新