与 malloc 混淆

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 创建一个 double 指针的一维数组(大小=100)。 我无法理解 malloc 又发生了什么?两个这样的语句有必要吗?

是否有任何替代方法可以以任何其他方式实现上面最后两行代码中发生的事情?

宏的计算结果为:

double (*f)[my];

这是指向双精度数组的指针,而不是指向双精度数组指针数组。

malloc 分配一个 2 * mx * <whateverfpoints to> 的数组(即双精度数组)。不知道为什么它分配的条目数是 mx 给出的两倍,但这就是它的作用。

所以,f指向后面第一个double数组。它有效地分配了一个 true 二维数组。 (不是经常混淆的 指向 double 的指针数组)。

请注意,malloc 的转换在 C 中是不好的做法。

点评:因为没有少打字,宏也没有加具体信息,其实是不好的做法。更糟糕的是,它隐藏了混淆代码的指针语义。建议不要使用它,但最好是明确的;这甚至不是更多的打字。

更新: 当前有一个 if sizeof(*f) presents _undefined behavior, becausef` is used uninitialized here。虽然我在这里看到标准中的缺陷应该更精确,但您最好谨慎行事并使用显式表达式:

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]) );