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