C++程序在循环后给出奇怪的int值
C++ program giving weird int value after looping
所以我尝试了下面的程序,它的预期输出,
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
我原以为x
是0
,因为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.
}
如果您在问,如果x
和a
在堆栈中存储得很近,那么在a
末尾之外进行修改可能会无意中更改x
的值。
在大型程序中,确定未定义行为的发生可能会变得非常困难,因为编译器在决定如何以及在哪里存储变量方面有很大的自由度。(并可能同时将其存储在多个位置(
相关文章:
- C++程序在循环后给出奇怪的int值
- 在这个无限循环中,当输入 0 时终止,当输入 int 范围之外的任何内容时,程序行为不正常
- win 表单应用程序字符串^ 到 int
- C++程序在将 int 与 cin 一起使用时有效,但不能使用字符串
- 程序无法编译:将 'int (*)[3][3]' 赋值为 'int [9][3][3]' 中的不兼容类型
- C++程序无法分配 int 数组?
- 调用 Parse int 函数时编译 parse 整数程序时出现问题
- 为什么我的 int 在 C++ 程序中间发生了变化?
- 将UWP应用程序的简单INT发送到另一个程序
- 不能在 VxWorks RTP 应用程序中使用 sysAuxClkRateSet( int ticksPerSecond )
- 在大型程序中将长变量更改为 int 类型
- 是否有任何用于ConstexPR操作员 (INT)的应用程序(INT)
- 我的 c++ 程序不打印任何字符,但是如果我将它们更改为 int,代码可以完美运行
- 试图使我的程序将INT值从0更改为1
- 由于 int 主错误而无法打开程序
- 创建一个程序,要求用户输入两个数字,并有三个可能的答案.代码未编译.数字(作为int)
- 以下程序中最大 int 1000 000(在 int 范围内)的整数溢出
- 为什么在我的测试程序中,从字符缓冲区读取一个int时,"std::copy"5x(!)比"
- 将所有 int 类型更改为另一种类型,使用 #define 用于大型程序
- 我找不到程序中的歧义,但编译器说 check(int) 和 check(float) 之间存在歧义