while循环内出现分段错误

时间:2019-07-07 18:52:41

标签: c arrays data-structures segmentation-fault

在这段代码中,当我在while循环中用j + 1替换i + 1时,它会产生分段错误。 两个变量都相同。

此代码段用于查找对由升序连续的整数组成的无序数组进行排序所需的最小交换次数。

int minimumSwaps(int n, int* a) {
int i=0,j=0,temp=0,swap=0;
for(i=0;i<n-1;i++)
{
    if(i+1!=a[i])
    {
        j=i;
        while(a[j]!=i+1)
        {
            j++;
        }
        temp=a[i];
        a[i]=a[j];
        a[j]=temp;
        swap++;
    }
    else 
    {
        continue;
    }

}
return swap;
}

3 个答案:

答案 0 :(得分:0)

  

当我在while循环中用j + 1替换i + 1时,这会产生分段错误。我不明白为什么,因为两个变量的值都相同

不,变量的值不相同。

    j=i;   // Here i and j hold the same value
    while(a[j]!=i+1)
    {
        j++;  // but once you execute this line i and j are no longer the same
    }

因此,将while(a[j]!=i+1)更改为while(a[j]!=j+1)会完全改变代码的行为。

顺便说一句-正确的方法是while(a[j]!=i+1)

答案 1 :(得分:0)

首先,您应该检查赋予函数的输入参数:

int minimumSwaps(int n, int* a) {
   if(n<=0){
      ...
   }

   if(NULL==a){
      ...
   }
   ...
}

这将避免您不得不处理错误的输入。然后,为避免出现不必要的边界内存读数,应按如下所示编辑while循环的条件:

while(j<n-1 &&  a[j]!=i+1){
   ...
}

答案 2 :(得分:-1)

您可以在两个位置将i+1替换为j+1。如果您指的是第二个位置,

while(a[j]!=i+1)
{
  j++;
}

while循环上的条件将不断变为更高的值(每次迭代j+1变为更高的值,而a[j]则引用了一个不同的值,因此直到您尝试执行以下操作,循环迭代才会结束在a的范围之外进行访问。