C 无法推断递归函数中出现分段错误的原因

C 无法推断递归函数中出现分段错误的原因,c,recursion,C,Recursion,通过注释代码的特定部分,我对代码进行了一些尝试。我发现,当我用变量j注释for循环(如代码所示)时,不会出现分段错误。此外,当我注释掉函数中的递归部分(函数调用自身的行)时,即使存在for循环,也不会发生seg错误。很明显,for循环在函数的第二次或更高的迭代中会导致问题,但我不知道为什么。我能想到的一个可能的原因是发生了无限递归,但据我所知,这里没有发生无限递归。 我一直在努力解决以下问题: #包括 int prime1[]={3,5,7,11,13,17}; int min=10000000

通过注释代码的特定部分,我对代码进行了一些尝试。我发现,当我用变量j注释for循环(如代码所示)时,不会出现分段错误。此外,当我注释掉函数中的递归部分(函数调用自身的行)时,即使存在for循环,也不会发生seg错误。很明显,for循环在函数的第二次或更高的迭代中会导致问题,但我不知道为什么。我能想到的一个可能的原因是发生了无限递归,但据我所知,这里没有发生无限递归。 我一直在努力解决以下问题:

#包括
int prime1[]={3,5,7,11,13,17};
int min=100000000//只是一些大数字
无效检查(int*,int);
无效掉期(int*,int,int);
int素数(int);
int main()
{
int T;
scanf(“%d”、&T);

对于(int i=0;i您的算法将永远运行,切换前两个分幅。
我删除了一些循环,
I=0
k=0
arr[]={4,3,}
我们剩下的是:

void check(int arr[], int step)
{
    int k, a[9];
    // arr[0] != 1, so k != 9, we fall in else { ... }
//  for (k = 0; k < 9; k++) {
//      if (arr[k] != k+1)
//          break;
//  }
//  printf("\n");
//  if (k == 9) {
//      if (step < min)
//          min = step;
//  } else {
        int i = 0;
//      for (int i = 0; i < 8; i++) {
//          if (i%3 != 2) {
//              if (prime(arr[i] + arr[i+1])) {
                    // i = 0, so i%3 != 2, so we fall in the first if
                    for (int j = 0; j < 9; j++)
                        a[j] = arr[j];
                    // you swap arr[0] with arr[1]
                    swap(a, i, i+1);
                    // and then you check again
                    check(a, step+1);
                    // and it runs so forever, never reaching this point
//              }
//          }
//          if (i <= 5) {
//              if (prime(arr[i] + arr[i+3])) {
//                  for (int j = 0; j < 9; j++)
//                      a[j] = arr[j];
//                  swap(a, i, i+3);
//                  check(a, step+1);
//              }
//          }
        }
    }
}
void检查(int-arr[],int-step)
{
int k,a[9];
//arr[0]!=1,所以k!=9,我们属于其他{…}
//对于(k=0;k<9;k++){
//如果(arr[k]!=k+1)
//中断;
//  }
//printf(“\n”);
//如果(k==9){
//如果(步骤<分钟)
//最小值=步长;
//}其他{
int i=0;
//对于(int i=0;i<8;i++){
//如果(i%3!=2){
//if(素数(arr[i]+arr[i+1])){
//i=0,所以i%3!=2,所以我们在第一个如果
对于(int j=0;j<9;j++)
a[j]=arr[j];
//将arr[0]与arr[1]交换
互换(a、i、i+1);
//然后你再检查一遍
检查(a,步骤+1);
//它永远在运行,从未达到这一点
//              }
//          }

//if(i)如果太多的递归深入,递归可能会导致seg.fault。但可能不是这样。我不知道main()后面的两行如何编译。这似乎不是一个问题。您可以编辑以尝试更一致和更强的缩进吗?
arr[i+1]
可以索引越界,并且
swap(a,i,i+1)
更危险,因为它是写的。在函数的第二部分中,您限制使用
i+3
if(iAside:不要忘记
2
是一个素数。
void check(int arr[], int step)
{
    int k, a[9];
    // arr[0] != 1, so k != 9, we fall in else { ... }
//  for (k = 0; k < 9; k++) {
//      if (arr[k] != k+1)
//          break;
//  }
//  printf("\n");
//  if (k == 9) {
//      if (step < min)
//          min = step;
//  } else {
        int i = 0;
//      for (int i = 0; i < 8; i++) {
//          if (i%3 != 2) {
//              if (prime(arr[i] + arr[i+1])) {
                    // i = 0, so i%3 != 2, so we fall in the first if
                    for (int j = 0; j < 9; j++)
                        a[j] = arr[j];
                    // you swap arr[0] with arr[1]
                    swap(a, i, i+1);
                    // and then you check again
                    check(a, step+1);
                    // and it runs so forever, never reaching this point
//              }
//          }
//          if (i <= 5) {
//              if (prime(arr[i] + arr[i+3])) {
//                  for (int j = 0; j < 9; j++)
//                      a[j] = arr[j];
//                  swap(a, i, i+3);
//                  check(a, step+1);
//              }
//          }
        }
    }
}