【问题标题】:Error Segmentation Fault - Why does my code keep calling my Recursive function infinitely?错误分段错误 - 为什么我的代码不断调用我的递归函数?
【发布时间】:2023-03-21 17:21:01
【问题描述】:

目标:在 L.H.S 上排列数组的负元素,在 R.H.S 上排列正元素

使用:递归

使用的数据类型:我使用了 Array,但它位于结构内,即 Array ADT

错误:分段错误

#include <stdio.h>
#include <stdlib.h>

struct Array 
{
    int a[10];
    int len;
};

void swap(int *a,int *b)
{
    int temp;
    temp = *a;
    *a = *b;
    *b = temp;
}

void NegativeSort(struct Array *arr, int i, int j)
{

    if(i < j)
    {
    
        if(arr-> a[i] > 0 && arr-> a[j] <= 0)
        {
            swap(&arr-> a[i], &arr-> a[j]);
            NegativeSort(arr, i++, j--);
        }
    
        else if(arr-> a[i] >= 0)
            NegativeSort(arr, i, j--);
    
        else
            NegativeSort(arr, i++, j);
    }
}


int main()
{
    struct Array arr = {{-1,2,-3,4,-5,6,-7,8},8};
           
    NegativeSort(&arr, 0, 7);
    
    printf("elements are : ");
    for(i = 0; i < arr.len - 1; i++)
        printf("%d", arr.a[i]);
    
    return 0;
    
}

【问题讨论】:

  • 1) 您的结构数组有 8 个“有效”元素:arr-&gt;a[0]arr-&gt;a[7]。您尝试访问arr-&gt;a[8],即0
  • 注明。但即使你把NegativeSort(&amp;arr,0,1) 作为参数,它仍然会给出分段错误错误。
  • 修复该错误...从i 访问元素到j-1。我怀疑这与你的无限递归有关。
  • 递归函数中的后自增和自减有什么意义? ij 不再使用,因此它没有做任何有用的事情。您的意思是增加/减少一些其他值,还是预先增加/减少?就目前而言,ij 被原封不动地传递给递归,即它总是像 NegativeSort(arr, i, j); 一样有效地递归,也许 NegativeSort(arr, i, j--); 应该是 NegativeSort(arr, i, j-1); 等等。
  • ...如果(i &lt; j) 在第一个函数调用开始时为真,那么它将永远为真,因此无限递归。

标签: c sorting recursion


【解决方案1】:

如果在 NegativeSort 的递归调用中发布递增和递减运算符,则由您使用。您从 main 调用 NegativeSort(arr,0,7)。如果调用 NegativeSort(arr, i, j--);那么该调用的参数将再次为 (arr,0,7),因为 j-- 的值与 j 相同。最好调用 NegativeSort(arr, i, j-1);同样对于 NegativeSort(arr, i++, j),它应该是 NegativeSort(arr, i+1, j)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-05-01
    • 1970-01-01
    • 2020-03-08
    • 1970-01-01
    • 2016-02-16
    • 1970-01-01
    • 2012-11-05
    • 1970-01-01
    相关资源
    最近更新 更多