如何解决'编程接收信号SIGSEGV,分段故障。&#39 ;?

时间:2018-03-14 12:40:11

标签: c segmentation-fault

我在调试代码时遇到标题中提到的错误。我知道它不漂亮。直到第5部分正常工作的所有事情。

我在没有第6部分的情况下进行了测试,它运行正常。我试图用第6部分做的是按顺时针螺旋顺序打印2D阵列的元素而不使用任何循环结构。

#include<stdio.h>

int check;
int arrprint(int a[20][20], int b[20][20], int n, int count, int check);
void loopprint(int a[20][20], int i, int n ,int choice1, int choice2, int x, 
int y);
void clockSpiral(int a[20][20], int n, int k, int l, int mc, int mr);

int main()
{
//PART 1

 int n,a[20][20];
 printf("\nEnter the order of the matrix(<=20) : ");
 scanf("%d",&n);
 int i,j;
 printf("\nEnter the elements of the matrix :\n");
 for(i=0;i<n;i++)
  for(j=0;j<n;j++)
   scanf("%d",&a[i][j]);
 printf("\nThe matrix in row major form is :\n");
 for(i=0;i<n;i++)
  { 
   for(j=0;j<n;j++)
    printf("%d ",a[i][j]);
   printf("\n"); 
  }

// PART 2

 printf("\nThe matrix in column major form is : ");
 for(i=0;i<n;i++)
  for(j=0;j<n;j++)
   printf("%d ",a[j][i]);

 int c[20][20];
 for(i=0;i<n;i++)
  for(j=0;j<n;j++)
   c[i][j]=a[i][j];

 // PART 4

 printf("\nThe matrix in anti diagonal form is : ");
 int count=0;
 printf("\n");
 check=0;
 for(count=1;count<=n;count++)
 {
  int b[count][count];
  arrprint(a,b,n,count,check);
 }


 count=count-2;
 check=1;
 for(count;count>0;count--)
 {
  int b[count][count];
  arrprint(a,b,n,count,check);
 } 

// PART 3

 int d[20][20];
 for(i=0;i<n;i++)
  for(j=0;j<n;j++)
   d[i][j]=a[i][j];

 printf("\nThe matrix in diagonal form is : ");
 printf("\n");
 check=3;
 for(count=1;count<=n;count++)
 {
  int b[count][count];
  arrprint(a,b,n,count,check);
 }

 count=count-2;
 check=4;
 for(count;count>0;count--)
 {
  int b[count][count];
  arrprint(a,b,n,count,check);
 }

//PART 5

 printf("\nThe matrix in anti clockwise spiral order is : ");
 count=0;
 int k=0,l=0,mr=n,mc=n;
 while(count<=n*n && k<mr && l<mc)
 {
  for(i=k;i<mr;i++)
  { 
   printf("%d ",a[i][l]);
   count++;
  }
  l++;
  for(i=l;i<mc;i++)
  {
   printf("%d ",a[mr-1][i]);
   count++;
  }
  mr--;
  for(i=mr-1;i>=k;i--)
  {
   printf("%d ",a[i][mc-1]);
   count++;
  }
  mc--;
  for(i=mc-1;i>=l;i--)
  {
   printf("%d ",a[k][i]);
   count++;
  }
  k++;
 }
 printf("\n");

//PART 6

 printf("\nThe matrix in clockwise spiral form is : ");
 clockSpiral(a,n,0,0,n,n);
 printf("\n");

 return 0;
}

int arrprint(int a[20][20], int b[20][20], int n, int count, int check)
{
 int i,j,ai,aj;
 if(check==0)
 {
  for(i=0,ai=0;ai<n && i<count;ai++,i++)
   {
    for(aj=0,j=0;aj<n && j<count;aj++,j++)
     {
      b[i][j]=a[i][j];
      if(i+j==count-1)
       printf("%d ",b[i][j]);
     }
   } 
 }

 if(check==1)
 {
  for(ai=n-count,i=0;ai<n && i<count;ai++,i++)
   { 
    for(aj=n-count,j=0;aj<n && j<count;aj++,j++)
    {
     b[i][j]=a[ai][aj];
     if(i+j==count-1)
      printf("%d ",b[i][j]);
    }  
   }
 }

 if(check==3)
 {
  for(aj=0,j=0;j<count && aj<n;j++,aj++)
   {
    for(ai=n-1,i=count-1; i>=0 && ai>=0;i--,ai--)
     {
      b[i][j]=a[ai][aj];
      if(i==j)
       printf("%d ",b[i][j]);
     }
   }
 }

 if(check==4)
{
 for(aj=n-count,j=0;j<count && aj<n;j++,aj++)
  {
    for(ai=0,i=0;ai<n && i<count;ai++,i++)
    {
     b[i][j]=a[ai][aj];
     if(i==j)
      printf("%d ",b[i][j]);
     }
   }
 } 

}


void loopprint(int a[20][20], int i, int n, int choice1, int choice2, int x, 
int y)
{
 switch(choice1)
 {
  case 1:
   if(choice2==1)
   {
    if(i<n)
    {
     y=i;
     printf("%d ",a[x][y]);
     i++;
     loopprint(a,i,n,1,1,x,i);
    }
   else 
     return;
   }
   if(choice2==2)
   {
    if(i<n)
    {
     x=i;
     printf("%d ",a[x][y]);
     loopprint(a,i,n,1,2,i,y);
    }
   else
     return;
   }
   break;
  case 2:
   if(choice2==1)
   {
    if(i<=n)
    {
     y=i;
     printf("%d ",a[x][y]);
     i--;
     loopprint(a,i,n,2,1,x,i);
    }
    else
     return;
   }
   if(choice2==2)
   {
    if(i>=n)
    {
     x=i;
     printf("%d ",a[x][y]);
     i--;
     loopprint(a,i,n,2,2,i,y);
    }
    else
     return;
   }
   break;
   default:
    return;
 }
 return;
}

void clockSpiral(int a[20][20], int n, int k, int l, int mc, int mr)
{
 if(k<mr && l<mc)
 {
  loopprint(a,l,mc,1,1,k,l);
  k++;
  loopprint(a,k,mr,1,2,k,mc-1);
  mc--;
  loopprint(a,mc-1,l,2,1,mr-1,mc-1);
  mr--;
  loopprint(a,mr-1,k,2,2,mr-1,l);
  l++;
  clockSpiral(a,n,k,l,mc,mr);
 }
 else
  return;
}

1 个答案:

答案 0 :(得分:0)

以下部分存在可能导致段违规的错误:

// PART 4

printf("\nThe matrix in anti diagonal form is : ");
int count=0;
printf("\n");
check=0;
for(count=1;count<=n;count++)
{
    int b[count][count];
    arrprint(a,b,n,count,check);
}

索引count达到并包括n(C中的索引从0变为n-1)。

功能arrprint有副作用,它实际上将count元素从a复制到b

如果n==20,则arrprint会将a的元素21复制到b的元素21。但是,这些元素不存在:seg fault!

此外,arrprint int a[20][20]的参数与a[count][count]的数组count!=20不同,因为第一行包含20个整数的行,但第二个包含行数<20英尺。因此寻址

b[i][j]=a[i][j];

将由编译器翻译为

b[i*20+j]=a[i*20+j];

不一样
b[i*count+j]=a[i*count+j];

这也会导致seg故障。

您应该将函数定义为:

int arrprint(int a[count][count], int b[count][count], int n, int count, int check)