当前位置:  开发笔记 > 编程语言 > 正文

数组元素在哪里出界?

如何解决《数组元素在哪里出界?》经验,为你挑选了1个好方法。

我想用c语言知道,如果我有一个长度为3的数组,如果我尝试访问数组的第4个元素,它将指向哪个内存地址?

我已经阅读了类似于访问数组元素的类似问题,他们说这是一个undefined behavior不安全的典型问题,但第4个元素指向的地方是否有任何通用规则

例如,array[3]这里给出的声明引用哪个内存地址?

int a = 10; 
int array[3] = {1, 2, 3};
int b = 20;
printf("%d", array[3]); // access the 4th element here

可以将它指向abarray[x]或它是完全随机的?

这里的关键点是:如果我在变量B之后声明变量A(特别是当它们是全局变量或静态变量时),它们是否会连续存储在内存中?或者它完全依赖于编译器?



1> Sourav Ghosh..:

首先,为了给你写的未定义行为的部分原因增加一些清晰度,按照规范,你可以写一个表达式,它给你一个超过最后一个元素的元素的地址,那很好,但是你可以不要取消引用它.后者调用未定义的行为.C11

考虑array[3]*(array + 3)引用C11标准,章节§6.5.6,附加运算符相同

[....]如果指针操作数和结果都指向同一个数组对象的元素,或者指向数组对象的最后一个元素,则评估不应产生溢出; 否则,行为未定义.

如果结果指向数组对象的最后一个元素之后,则不应将其用作*已计算的一元运算符的操作数.

所以,要总结这一起来,(array + 3)将指向最后一个元素的阵列中的下一个位置,(即,&array[2]),但地址是否将是地址的ab随机存储器位置,是编译器相关的,完全.


@NadavL是的,但无论如何都不能保证下一个地址是`a`或`b`的地址.
推荐阅读
谢谢巷议
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有