在c中调用函数时出现分段错误

在c中调用函数时出现分段错误,c,segmentation-fault,C,Segmentation Fault,代码是以螺旋方式打印给定的数字,比如 1 2 3 894 765 调用函数godown()时,我遇到一个segfault #包括 int o[100][100],c[100][100],p=0,q=0,m=0,n=0,a,i,j,r,d,l,u; void goright(int r); 空心高尔夫球场(内线l); 无效痛风(国际单位); 空货仓(INTD); int main() { INTR; printf(“\n输入行数\n”); scanf(“%d”和“&a”); printf(“\n输

代码是以螺旋方式打印给定的数字,比如

1 2 3
894
765

调用函数
godown()
时,我遇到一个segfault

#包括
int o[100][100],c[100][100],p=0,q=0,m=0,n=0,a,i,j,r,d,l,u;
void goright(int r);
空心高尔夫球场(内线l);
无效痛风(国际单位);
空货仓(INTD);
int main()
{
INTR;
printf(“\n输入行数\n”);
scanf(“%d”和“&a”);
printf(“\n输入要以螺旋方式打印的元素\n”);

对于(i=0;i您的递归代码大致如下所示:

void goright(int r)
{
    ...
    godown(d);
}

void godown(int d)
{
    ...
    goleft(l);
}

void goleft(int l)
{
    ...
    goup(u);
}

void goup(int u)
{
    ...
    goright(r);
}
我省略的内容(
)不包含任何
return
语句,因此一旦开始,此设置将永远递归。您可以通过在第一行打印
goxxx
函数的参数来验证这一点:它们将随着大小的增加而变为负值

因此,您需要一个rcursion的终止条件。您的
go
函数可以如下所示:

void goright(int r)
{
    if (r > 0) {
        ...
        godown(d);
    }
}
void goright(int r)
{
    if (r == 0) return;

    ...
    godown(d);
}
r r r d
u     d
u     d
l l l d
或者像这样:

void goright(int r)
{
    if (r > 0) {
        ...
        godown(d);
    }
}
void goright(int r)
{
    if (r == 0) return;

    ...
    godown(d);
}
r r r d
u     d
u     d
l l l d
您的代码仍然存在问题,主要是因为您将要插入的值存储在二维数组中。将这些值存储在大小为
a*a
的线性数组中会更容易—您只需跟踪一个以可预测方式移动的索引

另外,请不要将所有变量都定义为全局变量。其中许多变量是不需要的,尤其是函数参数的同名变量。像
i
j
这样的迭代器应该是本地的

您仍然可以使用递归方法。下面是一个示例。它只是用从1开始向上计数的数字填充螺旋。请注意,te打印循环不是完全循环的,它们短停一次,因此将按如下方式打印正方形:

void goright(int r)
{
    if (r > 0) {
        ...
        godown(d);
    }
}
void goright(int r)
{
    if (r == 0) return;

    ...
    godown(d);
}
r r r d
u     d
u     d
l l l d
这意味着您不必在走得太远后调整变量
m
n
。仅当您走完整圈时,即再次开始向右走后,才需要进行此调整。这种情况下还需要额外检查,以打印奇数边长度的最后一个中心值

#include<stdio.h>

int c[100][100], p=0, m=0, n=0;

void goright(int r);
void goleft(int l);
void goup(int u);
void godown(int d);

int main()
{
    int a;

    printf("\nenter the no. of rows\n");
    scanf("%d",&a);

    goright(a);

    for(int i = 0; i < a; i++) {
        for(int j = 0; j < a; j++) {
            printf("%3d",c[i][j]);
        }
        printf("\n");
    }

    return 0;
}

void goright(int x)
{
    if (x == 1) c[m][n] = ++p;
    if (x <= 1) return;

    for(int i = 1; i < x; i++) {
        c[m][n++] = ++p;
    }

    godown(x);
}

void godown(int x)
{
    for(int i = 1; i < x; i++) {
        c[m++][n] = ++p;
    }

    goleft(x);
}

void goleft(int x)
{
    for(int i = 1; i < x; i++) {
        c[m][n--] = ++p;
    }

    goup(x);
}

void goup(int x)
{
    for(int i = 1; i < x; i++) {
        c[m--][n] = ++p;
    }

    m++;
    n++;

    goright(x - 2);
}
#包括
int c[100][100],p=0,m=0,n=0;
void goright(int r);
空心高尔夫球场(内线l);
无效痛风(国际单位);
空货仓(INTD);
int main()
{
INTA;
printf(“\n输入行数\n”);
scanf(“%d”和“&a”);
戈赖特(a);
for(int i=0;i如果(x),则可能超出范围。请使用真正的调试器进行单步调试和检查。在某个时候,必须停止递归。继续无条件递归,最终溢出堆栈。更改变量名通常不会更改行为。。。