繁体   English   中英

while循环内的分段错误

[英]Segmentation fault inside while loop

在这段代码中,当我在 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;
}

当我在 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)

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

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

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

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

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

有两个位置可以用j+1替换i+1 j+1 如果您指的是第二个位置,

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

while 循环上的条件将不断变为更高的值(每次迭代j+1变为更高的值,而a[j]指的是不同的值,因此循环迭代不会结束,直到您尝试访问a的边界之外.

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM