为什么我遇到分段错误?



对于我的类,我们使用两个编译器,xcode 和 codeboard,其中代码板是两者中更严格的,并且有一个预设断言列表来测试你的代码。在我的函数 a 代码中,我有嵌套循环,我希望 i 始终领先于 k 一个。它在 xcode 中工作正常,但在代码板上给我带来了分段错误。

for (int k = 0; k <= n-2; k++) {
for (int i = k+1; i <= n-1; i++) {
if (array[k] == array[i])

奇怪的是,如果我使用 k++ 或 ++k 而不是 k+1,它不会导致分段错误,但我的代码不会传递所有断言。我以为它们应该是一回事?

更奇怪的是,如果我在函数 b 中使用 k+1,它不会导致代码板错误。

for (int k = 0; k <= n-1; k++) {
for (int i = k+1; i <= n-1; i++) {
if (array[k] > array[i])

基本上,这里发生了什么?

编辑:所以,我从每个人那里得到的是,当我在内循环中使用i = k + 1时,它会增加外循环中的k值。比如,如果 k=1,i=2,那么当它回到外循环时,k=3。如果是这样的话,我该如何让我保持领先于k?

编辑:请忽略我问题的 k++ 和 k+1 部分,这不是我的主要问题,只是一个让我感到困惑的侧面,但现在我明白了。我会从我的帖子中删除那部分,但我很确定这是不允许的。我的主要问题是如何保持我的 i 值 1 大于我的 k 值。

在下面的代码中,目标是如果任何数组值相同,则在某个时候它应该为 true。关于可重复的结果:

string a[3] = {"aaa", "bbbb", "cccc"};
int n = 3;
for (int k = 0; k <= n-2; k++) {
int b = 0;
for (int i = k+1; i <= n-1; i++) {
if (a[k] == a[i])
b++;
}
if (b != 0) {
cout << "true" << endl;
break;
}
else
cout << "false" << endl;
}

不,它们不一样:


k + 1返回k加 1 的值,但不更改k本身的值。


++k将 1 加到k并返回新值(前递增(。


k++还向k加 1,但返回以前的值k(后递增(。

k++++kk增加 1,从而更改k的值。

k+1没有。

您的分段错误来自这样一个事实,即每次评估初始 for 循环时,以及每次初始化第二个 for 循环时,您都会增加k。这意味着您在循环结束时读取的比数组更远。

k++ 和 k+1 并不相同。

如果在所显示的代码中使用 k++ 而不是循环中的 k+1,则实际上是在对变量 k 执行两个增量,这通常不是您在循环的控制变量中想要的。

  • K+1 不会改变 k 的值。
  • k++ 在使用其值后递增 k。
  • ++k 在使用其值之前递增 k。

所以基本上发生的事情是,每次你启动内部循环时,k都会递增。但是在外部循环的最后一轮中,当 k 等于 n-1 时,你执行另一个增量,将 k 设置为 n,这肯定不是你想要的。

相关内容

  • 没有找到相关文章