int()导致参数被覆盖

时间:2018-09-28 09:41:03

标签: c++ int

这可能是我遗失的相当简单的东西,但是有人可以在这里解释我的代码是怎么回事吗?

我希望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()函数有关,但我不明白为什么。

3 个答案:

答案 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所在的内存(至少取决于您的设置,它取决于机器,使用的编译器和许多设置)。这称为内存损坏,根据错误的严重程度,您甚至可能会得到堆栈损坏,或者,当然也可能是分段错误。

为防止此类错误,大多数编译器都会在此行发出警告。如果您没有遇到这种情况,请尝试调查是否可以配置警告更严格的编译器。