【问题标题】:Segmentation fault when the program tries write out the results程序尝试写出结果时出现分段错误
【发布时间】:2011-10-19 20:57:45
【问题描述】:

问候,

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

我想得到结果吗?

#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("szingularis\n");
            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("szingularis\n");
            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;
}

【问题讨论】:

  • [如果你暂时输入一些printfs 说“到这里”之类的话,它可能会帮助你找到问题,这样你就可以解决在哪里段错误实际发生]
  • 很抱歉,我不明白你想对我说什么
  • [当程序中发生分段错误之类的事情时,为了找出问题所在,添加printf("I just finished the for loop\n")之类的内容以帮助调试,然后删除他们之后] [编辑:或者如下所示,您可以使用调试器]

标签: c multidimensional-array segmentation-fault


【解决方案1】:

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 请记住 C 已为 n 元素分配空间,甚至在设置 v 之前。

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

你的缩进和空格的使用也可以改进一点。

【讨论】:

  • v中取矩阵值,v为数组个数(或向量个数)
  • 如果vn不同,你要么浪费内存(当vn)或者尝试写超出C的范围(当v> n)
【解决方案2】:

在函数 lup 的第 157 行(在第二个“if(isSingular==0)”块中)你写了

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

这行代码写在一个迭代 i 的 for 循环中,而 k 有一个来自最后一个循环的剩余值。该循环的中断条件是 k = v(C 的大小,A.K.A “b”来自上面的代码行)。

所以,基本上,你写道:

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

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

两个音符。首先,我做 .Net 人太久了,所以我可能在这里遗漏了一些完全微不足道的东西,在那种情况下,对不起。 其次,当您希望人们阅读您的代码时(例如在发布代码寻求帮助时),必须使用更有意义的名称,或者提高代码可读性的东西,但如果您不打算这样做,至少要避免混淆内容如果可以避免的话,比如将名为“C”的变量传递给名为“b”的参数。

【讨论】:

  • P.S.我不知道这是否是故意的,但你注意到释放你分配的内存。仅供参考
【解决方案3】:

查看此tutorial。它教你如何使用 GDB 查找段错误。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-02-26
    • 2015-08-27
    • 1970-01-01
    • 2023-03-11
    • 1970-01-01
    • 1970-01-01
    • 2018-09-24
    • 2016-07-25
    相关资源
    最近更新 更多