【发布时间】:2018-06-23 17:17:07
【问题描述】:
我通过注释掉代码的特定部分对我的代码进行了一些试验。我发现当我用变量 j(如代码所示)注释掉 for 循环时,不会发生分段错误。此外,当我注释掉函数中的递归部分(函数调用自身的行)时,即使存在 for 循环也不会发生段错误。很明显,for循环在函数的第二次或更高次迭代中引起了问题,但我不知道为什么。我能想到的一个可能原因是发生了无限递归,但据我所知,这里没有发生无限递归。 我一直在尝试解决以下问题:https://www.codechef.com/problems/H1
#include<stdio.h>
int prime1[]={3,5,7,11,13,17};
int min=1000000000; //just some large number
void check(int *, int);
void swap(int*, int, int);
int prime(int);
int main()
{
int T;
scanf("%d", &T);
for(int i=0; i<T; i++)
{
printf("\n");
int arr[9];
for(int j=0; j<9; j++)
scanf("%d", &arr[j]);
check(arr, 0);
if(min==1000000000)
min=-1;
printf("%d\n", min);
}
}
void check(int arr[],int step) //step indicates the level of
//iteration
{
int k, a[9];
for(k=0; k<9; k++)
{
if(arr[k]!=k+1)
break;
}
if(k==9)
{
if(step<min)
min=step;
}
else
{
for(int i=0; i<8; i++)
{
if(i%3!=2)
{
if(prime(arr[i]+arr[i+1]))
{
for(int j=0; j<9; j++) // segmentation fault
a[j]=arr[j];
swap(a, i, i+1);
check(a, step+1);
}
}
if(i<=5)
{
if(prime(arr[i]+arr[i+3]))
{
for(int j=0; j<9; j++) // segmentation fault
a[j]=arr[j];
swap(a, i, i+3);
check(a, step+1);
}
}
}
}
}
int prime(int a)
{
for(int i=0; i<6; i++)
{
if(a==prime1[i])
return 1;
}
return 0;
}
void swap( int a[], int b, int c)
{
int temp;
temp=a[b];
a[b]=a[c];
a[c]=temp;
}
【问题讨论】:
-
递归可能导致seg。如果递归深度太多,则会出错。但也许情况并非如此。
-
我看不到 main() 之后的两行如何编译。这似乎不是minimal reproducible example。
-
您能否编辑以尝试更一致和更强的缩进?
-
arr[i+1]可能会超出范围,swap(a, i, i+1);更危险,因为它正在写入。在函数的第二部分中,您限制了i+3和if(i<=5)的使用,但在第一部分中您没有这样的限制,除了可疑的if(i%3!=2)。 -
旁白:别忘了
2是一个素数。