"动态分配内存模拟多维数组"的正确术语是什么?

3

不久前,我在一个问题中询问了一些内容,其中在提交的回答中告诉我,使用术语“多维数组”来描述以下构造是不准确的:

int **a;

初始化方法如下:

a = malloc(n * sizeof(*a));
for (i = 0; i < n; ++ i)
    a[i] = malloc(m * sizeof(*a[i]));

这里的术语“emulation of multi-dimensional array”是误导性的,只是一个多维数组的“模拟”。作为非英语母语者,我很难弄清楚什么是正确的术语。不幸的是,抱怨术语的人自己也没有提供帮助。
确实,术语“emulation of multi-dimensional array”太长了,实际上在文本/对话中不太可能使用。
总之:
  • 上面的结构的正确术语是什么(特别是在C中,如果有区别的话)?
附加问题:
  • 这个术语是否与语言无关?如果不是,例如在C++中如何称呼它?
注:如果您的答案能够链接到参考资料,我会很高兴。
编辑:我知道这种构造和int a[n][m];之间的区别。这不是问题。

更新

分配的内存不一定是规则的。这个结构更加精确:

a = malloc(n * sizeof(*a));
for (i = 0; i < n; ++ i)
  if (needed[i])
    a[i] = malloc(m[i] * sizeof(*a[i]));
  else
    a[i] = NULL;

旁注(除了术语):你明白它和一个大小为nxm的二维数组之间的区别,对吧? - David Rodríguez - dribeas
@DavidRodríguez-dribeas,是的,当然可以。 - Shahbaz
4个回答

7

我一直听说这些被称为“锯齿数组” - 即使每个子数组的长度相同,它们也可以具有不同的长度,因此使用了“锯齿”的术语。在真正的多维数组中,每个维度都有固定的大小,在这种情况下只有第一维是真正固定的。


我一直听说它们被称为“不规则数组” - 我怀疑其中一个是另一个的变形。 - caf
我可能错了,但我觉得“锯齿数组”是由C#语言流行起来的一个术语,因为它们需要区分锯齿数组和真正的多维数组。 - Jesse Good
@Jesse:这里也是一样的区别,在Java和大多数其他具有“真正”多维数组类型的语言中也是如此。 - Ben Voigt
@BenVoigt: 我不想太过追究,但据我所知,C、C++和Java没有“真正的”多维数组,而C#有。请阅读这里的第一行和这个Stack Overflow问题 - Jesse Good
@JesseGood:C++旨在为用户定义的类型(包括操作符重载)提供良好的支持,因此多维数组类(请参见我答案中提到的Boost)可以像任何内置语言特性一样高效。就所有意图而言,这是“真实”的。 - Tony Delroy
1
@Jesse: 在C和C++中,int a[6][7];是一个“真正的”多维数组(只有一个数组、一个块,所有元素都存储在连续的内存空间中)。这与本问题中的内容非常不同。你不能将int a[6][7];传递给函数f(int** a),它们不兼容。 - Ben Voigt

1

这是一个“数组(指针)的数组”,这个术语在各种语言中都能理解,并且适用于元素数组的长度是否相等(方形AoAs)或不相等(嵌套AoAs)。


所以在我的原始问题中(我链接的那个问题),我应该说“我有一个数组的数组的数组的数组的数组的数组”吗?还是“AoAoAoAoAoA”? - Shahbaz
我可能会接受你的答案,但你认为这个术语怎么样:“动态6维数组”?也就是说,添加动态以使人们理解它是通过malloc分配的。 - Shahbaz
@Shahbaz: 你当然可以用动态的来描述你的例子,比如“一个动态数组的数组”。但是仅仅使用动态并不足以说明这种类型的数组。 - Ben Voigt

1
“嵌套数组”或“数组的数组[...]”。
虽然我认为它不支持不同的维度,但Boost在这个模糊的领域提供了一个解决方案-http://www.boost.org/libs/multi_array/doc/user.html-即使您正在实现新的东西,设计决策和接口也值得考虑。

0

我会像c-faq中所说的那样称之为“模拟多维数组”。如果你认为这个术语太长,你可以说“模拟2D数组”等。然而,永远不应该将int **a;称为多维数组,因为它的类型是指向指针的指针,我认为区别在于指针可以用来构建数组,但它们始终保持为指针。此外,应该知道指针数组(int *a[10];)也可以用来构建不规则数组,因此术语并不特指你所拥有的。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接