C++ C++;循环后给出奇怪int值的程序

C++ C++;循环后给出奇怪int值的程序,c++,c,C++,C,所以我尝试了下面的程序及其预期输出 int main() { int x = 0; int a[5]; int len = *(&a + 1) - a; //length of array cout << "LEN:" << len << endl; //len = 20; for (int i = 0; i < len; i++) { a[i] = i;

所以我尝试了下面的程序及其预期输出

int main()
{
    int x = 0;
    int a[5];
    int len = *(&a + 1) - a; //length of array
    cout << "LEN:" << len << endl;

    //len = 20;
    for (int i = 0; i < len; i++) {
        a[i] = i;
    }

    cout << "X  :" << x << endl;
    return 0;
}
然后我取消了第8行的注释(
//len=20;
)并重试,这再次给出了上述正确的输出

然后我注释了第8行,并将循环更改为(inti=0;i<20;i++){,它给出了以下输出

LEN:5
X  :6
我原以为
x
0
的,因为
x
与循环无关(或者是吗?),然后我得到了
x
作为
6
。它还抛出了
分段错误,这也是第10行所期望的(访问越界)。有人能解释一下这种行为的原因吗?它是在windows环境下用
gcc
编译的


(仅供参考:这只是一个实验性代码)

通常,在数组末尾之外写入会导致未定义的行为。这可能会导致不相关的代码以意外的方式更改

第二个示例中未定义的行为可以简化为:

int main() {
  int a[5];
  for (int i=0; i<20; i++)
    a[i] = i; // undefined behavior once i reaches 5.
}
intmain(){
int a[5];

对于(int i=0;i
int len=*(&a+1)-a;//数组的长度
为什么会是数组的长度,在我看来像UB?@PiRocks我在测试指针和其他东西,在教程中看到了它您正在访问数组的边界之外,因此如果有未定义的行为,任何东西都可以happen@benjaminc在线教程充满了基于知识的误解和猜测“它在我的机器上工作,所以它必须是正确的”。
int main() {
  int a[5];
  for (int i=0; i<20; i++)
    a[i] = i; // undefined behavior once i reaches 5.
}