c-程序尝试写出结果时出现分段故障



问候,

有人会发现,当我接受所有输入时,为什么要写出这些程序分段错误?我找不到哪里有问题,或者哪里应该修改我的代码

我想知道结果吗?

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

void inMatrix(int n, double **matrix)
{
    int j, i;
    for (i = 0; i < n; i++)
    {
        for (j= 0; j < n; j++)
        {
            scanf("%lf", &matrix[i][j]);
        }
    }
}
void inVector(double *vektor, int n)
{
    int k;
    for (k = 0; k < n; k++)
    {
        scanf("%lf", &vektor[k]);
    }
}
void outVector(double *vektor, int n)
{
    int k;
    for (k = 0; k < n; k++)
    {
        printf("%.8lf ", vektor[k]);
    }
}
void lup(int n, double **A, double **b, int v)
{
    int *Permutation = (int*)malloc(sizeof(int)*n);
    int i,j;
    int k;
    double *max = (double*) malloc (sizeof(double)*n);
    int m=0, p=0;
    int tmp=0, tmp2=0;
    int t=0, isSingular=0;
    double largestElement=0.0;
    double *helpVector = (double*) malloc (sizeof(double)*n);
    double *helpVectorA = (double*) malloc (sizeof(double)*n);
    double *helpVectorB = (double*) malloc (sizeof(double)*n);

//    for(i=0;i<n;i++)
//    {
//        for(j=0;j<n;j++)
//        {
//            A[i][j]=D[i][j];
//        }
//    }
    for(i=0; i<n; i++)
        Permutation[i]=i;
    for(m=0; m<n-1; m++)
    {
        for(i=m; i<n; i++)
        {
            max[i]=fabs(A[i][m]);
        }
        for(i=m; i<n; i++)
        {
            if(max[i]>largestElement)
            {
                largestElement=max[i];
                p=i;
            }
        }
        for(i=0; i<n; i++)
        {
            helpVectorA[i]=A[m][i];
            helpVectorB[i]=A[p][i];
        }
        for(i=0; i<n; i++)
        {
            A[m][i]=helpVectorB[i];
            A[p][i]=helpVectorA[i];
        }
        tmp=Permutation[m];
        tmp2=Permutation[p];
        Permutation[m]=tmp2;
        Permutation[p]=tmp;
        if(fabs(A[m][m])>0.00000000000000001)
        {
            for(i=m+1; i<n; i++)
            {
                A[i][m]=A[i][m]/A[m][m];
                for(j=m+1; j<n; j++)
                {
                    A[i][j]=A[i][j]-A[i][m]*A[m][j];
                }
            }
        }
        if(fabs(A[m][m])<0.00000000001)
        {
            printf("szingularisn");
            isSingular=1;
            break;
        }
        for(i=0; i<n; i++) max[i]=-1;
        largestElement=0.0;
        p=m+1;
    }
    if(isSingular==0)
    {
        if(fabs(A[n-1][n-1])<0.00000000001)
        {
            printf("szingularisn");
            isSingular=1;
        }
    }
    if(isSingular==0)
    {
        for(k=0; k<v;k++)
        {
             for(i=0; i<n; i++)
        {
            t=Permutation[i];
            helpVector[i]=b[k][t];
        }
        for(i=0; i<n; i++)
        {
            b[i][k]=helpVector[i];
        }
        for(i=1; i<n; i++)
        {
            for(j=0; j<i; j++)
            {
                b[k][i]-=A[i][j]*b[k][j];
            }
        }
        for(i=n-1; i>=0; i--)
        {
            for(j=i+1; j<n; j++)
            {
                b[k][i]-=A[i][j]*b[k][j];
            }
            b[k][i]=b[k][i]/A[i][i];
        }
    }
    for(i=0; i<n; i++)
    {
        printf("%.8lf ", b[k][i]);
    }
    printf("n");
 }
}
int main()
    {
        int k, v,n;
        int j;
        double **A;
        double **C;
        // read dimension of matrix and value
        scanf("%d", &n);
        //matrix
        A = (double **) calloc(n, sizeof ( double*));
        // matrix to store the vectors
        C = (double **) calloc(n, sizeof(double *));
        while(n!=0)
        {
        for (k = 0; k < n; k++)
        {
            A[k] = (double *) calloc(n, sizeof ( double));
        }
            inMatrix(n, A);
            scanf("%d", &v);
            for(k=0;k<v;k++)
            {
                C[k] = (double *) calloc(n, sizeof ( double));
            }
            for(k=0; k<v;k++)
            {
                for(j=0;j<n;j++)
                {
                    scanf("%lf", &C[k][j]);
                }
            }
            //print out result
            for(k=0;k<v;k++)
            {
                for(j=0;j<v;j++)
                {
                    lup(n,A,C,v);
                }
            }
        }
    return 0;
}

main中,您有

        /* ... */
        C = (double **) calloc(n, sizeof(double *));

n元件

        while(n!=0)
        {
        for (k = 0; k < n; k++)
        {
            A[k] = (double *) calloc(n, sizeof ( double));
        }
            inMatrix(n, A);
            scanf("%d", &v);
            for(k=0;k<v;k++)

v?它是从哪里来的?你是说n吗请记住,即使在设置v之前,C也已为n元素分配了空间。

            {
                C[k] = (double *) calloc(n, sizeof ( double));
            }
            /* ... */

您的缩进和空白的使用也可以有所改进。

在函数lup的第157行(在第二个"if(isSingular==0("块中(,您编写了

printf("%.8lf ", b[k][i]);

这一行是在for循环中写的,循环对i进行迭代,而k有最后一个循环的剩余值。该循环的中断条件是k=v(C的大小,从上面的代码行中可以称为"b"(。

所以,基本上,你写道:

printf("%.8lf", b[MaxIndexOfB+1][i];

这可能就是你要找的那个臭家伙。

两个音符。首先,我做网络人的时间太长了,所以我可能会错过一些微不足道的东西,如果是这样的话,对不起。其次,当你想让人们阅读你的代码时(比如在发布代码寻求帮助时(,必须使用更有意义的名称,或者提高代码可读性的东西,但如果你不打算这样做,至少要避免混淆,比如在可以避免的情况下,将名为"C"的变量传递到名为"b"的参数中。

查看本教程。它教您如何使用GDB查找segfault。

最新更新