【问题标题】:Segmentation fault inside while loopwhile循环内部的分段错误
【发布时间】:2019-07-07 18:52:41
【问题描述】:

在这段代码中,当我在 while 循环中将 i+1 替换为 j+1 时,会出现分段错误。我不明白为什么,因为这些值 两个变量是相同的。

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

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;
}

【问题讨论】:

  • 你说的是哪个 i+1 替换代码中有两个?也许你可以说得更清楚。
  • 数组是否总是包含数字 1 ?你能告诉我们你是如何调用这个函数的吗?
  • 引用:“当我在 while 循环中将 i+1 替换为 j+1 时,会出现分段错误。我不明白为什么,因为两个变量的值是相同的。”你这是什么意思?变量ij相同!
  • 还有...为什么要用j+1 替换i+1?这毫无意义...您正在搜索值为 i+1 的元素,那么为什么要替换为 j+1
  • @Siddharth-Soni while 循环中的第二个

标签: c arrays data-structures segmentation-fault


【解决方案1】:

当我在 while 循环中将 i+1 替换为 j+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)

【讨论】:

  • 假设 i=1,那么根据 j=i,j 的值也为 1。那么如果我写 j+1 而不是 i+1 有什么区别,因为无论如何这个值都在变化为 2(在 for 循环内)
  • @pranj99 是的,j 的值将变为 2,但 i 的值仍为 1。所以 ji 会有所不同
  • @4386427 恕我直言不回答也不解决问题。
  • @GiovaLomba 它确实...当代码使用i + 1 时,它工作得很好(只要输入遵循规定的规则)。所以代码中真的没有“要解决的问题”。 “解决”的问题是 OP 的误解,即 ij 是可以互换的。他们不是,这就是答案所解释的。
  • @4386427 我理解你的意思,也许应该改变问题以反映你所说的,以便对其他人也有用。
【解决方案2】:

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

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

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

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

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

【讨论】:

    【解决方案3】:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-03-18
      • 2014-03-23
      • 1970-01-01
      • 1970-01-01
      • 2022-01-22
      • 2013-12-22
      • 1970-01-01
      • 2010-12-18
      相关资源
      最近更新 更多