C&C++   发布时间:2022-04-03  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了为什么在C中展开多维数组是非法的?大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
参见英文答案 > One-dimensional access to a multidimensional array: well-defined C?4个
我的书(Kenneth Reek的C指针)说,以下是非法的,尽管它工作正常.
int arr[5][5];
  int *p=&arr[2][2];
  p=p+3; // As array is stored in row major form I think this 
         //should make p point to arr[3][0]

这本书说,下一行留下一行是非法的.但我不明白为什么.

解决方法@H_673_9@
我凝视了一段时间,我会尽力解释我认为他来自哪里,然没有阅读这本书,但这将是最好的推测.

首先,在技术上,你提出的增量(或他提出)并不是非法的;取消引用它是.该标准允许您将一个指针提前一个,超过数组序列的最后一个元素,从它的采购来估值,而不是取消引用.将其更改为p = p 4,并且都是非法的.

除此之外,阵列的线性足迹不能承受,ar [2]有一种类型,它是int [5].如果您不信,请虑以下内容,所有这些都正确键入:

int ar[5][5];
int (*sub)[5] = ar+2;   // sub points to 3rd row
int *col = *sub + 2;    // col points to 3rd column of third row.
int *p = col + 3;       // p points to 5th colum of third row.

这是否属于ar [3] [0]是不相关的您超过了指定数学的维度的声明幅度.结果不能在法律上被解除引用,并且比3偏移大,也不能甚至被法定评估.

记住,正在寻址的阵列是ar [2];不仅仅是ar,而是说相同的被宣称为size = 5.它与同一个ilk的另外两个数组相反,与目前正在进行的寻址无关.我相信Christoph’s answer提出的这个问题,应该是一个被选为彻底解决方案的人.特别是参C99§6.5.6,p8,尽管如此,

对不起垃圾邮件,但大胆的亮点是我认为与您的问题相关的.通过解决您的问题,您正在离开正在被处理的阵列,并且这样走进UB.总之,它的作品(通常),但是是不合法的.

大佬总结

以上是大佬教程为你收集整理的为什么在C中展开多维数组是非法的?全部内容,希望文章能够帮你解决为什么在C中展开多维数组是非法的?所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。