“动态分配的内存模拟多维数组”的正确术语?
Posted
技术标签:
【中文标题】“动态分配的内存模拟多维数组”的正确术语?【英文标题】:Proper terminology for "dynamically allocated memory emulating multi-dimensional array"? 【发布时间】:2012-07-19 08:16:40 【问题描述】:前段时间我问过question,在其中我被告知(在提交中)使用术语“多维数组”来表示这样的构造:
int **a;
这样初始化:
a = malloc(n * sizeof(*a));
for (i = 0; i < n; ++ i)
a[i] = malloc(m * sizeof(*a[i]));
具有误导性,并且这“只是一个多维数组的模拟”。不是以英语为母语的人,我很难弄清楚什么是正确的术语。不幸的是,抱怨术语的人自己也无济于事。
果然,“多维数组的仿真”这个词太长了,实际用在文本/对话中。
总结一下:
上述构造的正确术语是什么(特别是在 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 的二维数组之间的区别是什么,对吧? @DavidRodríguez-dribeas,当然可以。 【参考方案1】:我一直听说这些被称为“锯齿状数组”——即使每个子数组的长度相同,它们也可以具有不同的长度,因此称为“锯齿状”。 (在真正的多维数组中,每个维度都有固定的大小,在这种情况下只有第一个维度是真正固定的。)
【讨论】:
我一直听说它们被称为“参差不齐的数组”——我怀疑其中一个是另一个的损坏。 我可能错了,但我觉得“锯齿状数组”是 C# 语言流行的一个术语,因为它们必须区分锯齿状数组和真正的多维数组。 @Jesse:这里有同样的区别,在 Java 和大多数其他具有“真正”多维数组类型的语言中。 @BenVoigt:我不想太迂腐,但 AFAIK、C、C++ 和 Java 没有“真正的”多维数组,而 C# 有。阅读第一行here 和这SO question。 @Jesse:int a[6][7];
是 C 和 C++ 中的“真正”多维数组(只有一个数组,一个块,所有元素连续存储)。这与这个问题中的事情非常不同。您不能将 int a[6][7];
传递给函数 f(int** a)
,它们不兼容。【参考方案2】:
它是一个“(指向)数组的数组”,该术语在多种语言中都有所理解,并且适用于元素数组的长度是否相等(方形 AoA)或不相等(锯齿状 AoA)。
【讨论】:
所以在我原来的问题(我链接的那个)中,我应该说“我有一个数组数组数组数组数组”?还是“AoAoAoAoAoA”? 我可能会接受您的回答,但是您如何看待这个术语:“动态 6 维数组”?也就是加动态让人明白是malloc
ed。
@Shahbaz:您当然可以使用 dynamic 来限定您的示例,例如“动态数组数组”。但是动态本身既没有必要也不足以表明这种数组。【参考方案3】:
“嵌套数组”或“数组的数组 [of ...]”。
虽然我不认为它支持不同的维度,但 Boost 在这个模糊的领域提供了一个产品 - http://www.boost.org/libs/multi_array/doc/user.html - 即使您正在实施新的东西,设计决策和界面也可能值得考虑。
【讨论】:
【参考方案4】:我会像在c-faq 中那样将该构造称为“模拟多维数组”。如果您认为该术语太长,您可以说“模拟二维数组”等。但是,永远不要将 int **a;
称为多维数组,因为它的类型是指向 int
的指针的指针.我认为区别在于指针可用于构造数组,但它们将始终保留为指针。另外,应该知道指针数组 (int *a[10];
) 也可以用来构造锯齿状数组,因此术语不会专门指您所拥有的。
【讨论】:
以上是关于“动态分配的内存模拟多维数组”的正确术语?的主要内容,如果未能解决你的问题,请参考以下文章