首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C语言中的二维数组是否需要使所有元素都连续?

问C语言中的二维数组是否需要使所有元素都连续?
EN

Stack Overflow用户
提问于 2013-06-16 00:01:35
回答 4查看 491关注 0票数 5

我从一个朋友那里听说,C语言中的二维数组只在语法上被支持。

他告诉我最好使用float arr[M * N]而不是float[M][N],因为像gcc这样的C编译器不能保证在每个系统/平台上数据都在内存中连续存在。

我想在我的硕士论文中使用这个作为论点,但我没有任何参考。

所以第一个问题是:

他说的是真的吗?

第二个问题:

你知道在哪里有一本书或一篇文章可以找到这句话吗?

感谢+问候

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2013-06-16 00:06:36

,

  1. ,不,他错了,

,

  1. ,看看C标准。一些相关的内容(突出强调我的观点):

6.2.5类型?20

数组类型描述具有特定成员对象类型(称为element类型)的连续分配的非空对象集。

6.7.6.2数组声明符?3(注142)

当几个“数组”规范相邻时,将声明一个多维数组。

6.5.2.1数组下标»3

连续的下标运算符指定多维数组对象的元素。 ...由此可以得出,数组是以行为主的顺序存储的(最后一个下标变化最快)。

也许最明确的例子是6.5.2.1数组下标?4中的示例

示例考虑由声明定义的数组对象

int x[3][5];

这里,x int**s;是一个3x5的 int**s**.数组,更准确地说,x* 是一个由三个element对象组成的数组,每个element对象是一个由五个element对象组成的数组在表达式中,相当于`(((x)+(i))),xis first converted to a pointer to the **initial array of five** **int****s**. Theniis adjusted according to the type ofx, which conceptually entails multiplyingiby the size of the object to which the pointer points, **namely an array of five** **int** **objects**. The results are added and indirection is applied to **yield an array of five** **int****s**. When used in the expressionxi, that array is in turn converted to a pointer to the first of the ints, soxi`的x[i]会产生一个整数。

C中的多维数组就是“数组的数组”。它们工作得很好,并且100%由标准定义。

您可能还会发现阅读comp.lang.c常见问题解答中的Section 6, Arrays and Pointers会很有帮助。

票数 13
EN

Stack Overflow用户

发布于 2013-06-16 00:21:20

这个问题比其他答案听起来更微妙:

虽然多维数组(在语义上,可能不是物理上)是连续的,但只有当您停留在最初引用的数组的边界内时,才会定义指针算法(实际上,您可以超出上限1个元素,但只有在不取消引用的情况下)。

这意味着,语言语义禁止从头到尾遍历多维数组,而C语言的边界检查实现(原则上是可能的,但由于性能原因在野外很少见)可能会引发段错误,打印诊断信息,或者在您跨越子数组的边界时让恶魔从鼻子里飞出来。

我不确定编译器是否将此信息用于优化目的,但原则上,它们可以。例如,如果您有

代码语言:javascript
复制
float *p = &arr[2][3];
float *q = &arr[5][9];

那么,无论x和y的值是什么,p + x和q + y都不应该有别名。

票数 7
EN

Stack Overflow用户

发布于 2013-06-16 00:10:55

6.2.5.20节要求数组是连续分配的。这不仅适用于一维数组,也适用于数组的数组。

你的朋友就是错了。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17125472

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档