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

C++ program giving weird int value after looping

本文关键字:int 程序 循环 C++      更新时间:2023-10-16

所以我尝试了下面的程序,它的预期输出,

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;
}

给出预期输出:

LEN:5
X  :0

然后,我取消了第8行(//len = 20;(的注释并重试,这再次给出了上述正确的输出。

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

LEN:5
X  :6

我原以为x0,因为x与循环无关(或者确实如此?(,然后我得到了这个x作为6。它还抛出了Segmentation fault,这也是在第10行中预期的(访问越界(。有人能解释一下这种行为的原因吗?它是用gcc在windows环境下编译的。

(仅供参考:这只是一个试验代码(

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

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

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

如果您在问,如果xa在堆栈中存储得很近,那么在a末尾之外进行修改可能会无意中更改x的值。

在大型程序中,确定未定义行为的发生可能会变得非常困难,因为编译器在决定如何以及在哪里存储变量方面有很大的自由度。(并可能同时将其存储在多个位置(