我想用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
可以将它指向a
或b
或array[x]
或它是完全随机的?
这里的关键点是:如果我在变量B之后声明变量A(特别是当它们是全局变量或静态变量时),它们是否会连续存储在内存中?或者它完全依赖于编译器?
首先,为了给你写的未定义行为的部分原因增加一些清晰度,按照规范,你可以写一个表达式,它给你一个超过最后一个元素的元素的地址,那很好,但是你可以不要取消引用它.后者调用未定义的行为.C11
考虑array[3]
与*(array + 3)
引用C11
标准,章节§6.5.6,附加运算符相同
[....]如果指针操作数和结果都指向同一个数组对象的元素,或者指向数组对象的最后一个元素,则评估不应产生溢出; 否则,行为未定义.
和
如果结果指向数组对象的最后一个元素之后,则不应将其用作
*
已计算的一元运算符的操作数.
所以,要总结这一起来,(array + 3)
将指向最后一个元素的阵列中的下一个位置,(即,&array[2]
),但地址是否将是地址的a
或b
或随机存储器位置,是编译器相关的,完全.