这可能是我遗失的相当简单的东西,但是有人可以在这里解释我的代码是怎么回事吗?
我希望arrayone[0]
保持不变,因为我从不重新分配它,但是在某个地方,它已从3
更改为1
。
int arrayone[1];
int arraytwo[1];
arrayone[0]=3;
cout << "expected: 3\n";
cout << arrayone[0] << "\n";
arraytwo[0] = int(arrayone[0]/4.0); //int (5/4) = 0
cout << "expected: 3 0\n";
cout << arrayone[0] << " " << arraytwo[0] << "\n";
arraytwo[1] = int(arrayone[0]/2.0); //int (3/2) = 1
cout << "expected: 3 0 1\n";
cout << arrayone[0] << " " << arraytwo[0] << " " << arraytwo[1] <<"\n";
(最后一行返回1 0 1
而不是3 0 1
)
我尝试测试一些东西,看看它在哪里改变;而且我认为这与int()函数有关,但我不明白为什么。
答案 0 :(得分:6)
您使用的是arraytwo[1]
,它是超出范围。因此,您将拥有undefined behavior。
也许您打算将arraytwo
定义为两个元素的数组:
int arraytwo[2];
您对int()
进行的投射与它无关。
关于转换的注释:如果要在除法之后输入整数,为什么不从整数开始?如
arraytwo[0] = arrayone[0] / 4;
答案 1 :(得分:1)
您需要像这样声明arraytwo
,其大小为2,即元素0和1
int arraytwo[2];
您没有说要使用什么工具链,但这是静态和动态分析都可以检测到的东西(例如分别是clang静态分析器和消毒剂)。
答案 2 :(得分:1)
arraytwo[1] = int(arrayone[0]/2.0); //int (3/2) = 1
此处您正在写入arraytwo
以外的区域(该区域的大小为1,因此只能写入arraytwo [0])。那是未定义的行为-实际上发生的是它无论如何都会写到计算出的位置,这就是arrayone
所在的内存(至少取决于您的设置,它取决于机器,使用的编译器和许多设置)。这称为内存损坏,根据错误的严重程度,您甚至可能会得到堆栈损坏,或者,当然也可能是分段错误。
为防止此类错误,大多数编译器都会在此行发出警告。如果您没有遇到这种情况,请尝试调查是否可以配置警告更严格的编译器。