计算矩阵乘法时的分段错误(核心转储)错误

时间:2016-02-07 19:36:09

标签: c matrix

我正在尝试在C中实现矩阵乘法。如果我使用矩阵大小超过3,我会得到分段错误错误。对于2x2矩阵,这个代码可以很好地工作。我试图找出原因。

这是我的代码。请看看它,让我知道我做错了什么。

#include <stdio.h>
#include <stdlib.h>     
#include <time.h>
/*  
matrix data structure. 
rs = row start
re = row end
cs = column start 
ce = column end
a = pointer to array of pointers
*/       

typedef struct _matrix {
    int rs;
    int re;
    int cs;
    int ce;
    int **a ;
}matrix;

matrix random_matrix(int n)
{
    matrix random;
    int i, j, k; 

    random.a = (int **)malloc(sizeof(int *) * n);
    for (k=0; k < n; k++)
         random.a[k] = (int *)malloc(n * sizeof(int));

    random.cs = random.rs = 0;
    random.ce = random.re = n -1; 

    for(i=0; i < n; i++){
        for(j = 0; j < n; j++){
            random.a[i][j] = rand()/108108108.0;
    }
}

    return random;       
}

void display(matrix m)
{
    int i, j;

    for (i=m.rs ; i<=m.re ; i++) {
        for (j=m.cs ; j<=m.ce ; j++) {
            if(j==m.ce)
                printf("%d", m.a[i][j]);
            else 
                printf("%d, ", m.a[i][j]);
        }
    printf("\n");
    }
    printf("\n");

    return;
}

matrix multiply(matrix m1, matrix m2)
{
    int n = m1.re - m1.rs;
    matrix result;

    result.rs = result.cs = 0;
    result.re = result.ce = n;

    result.a = (int **)malloc(sizeof(int *) * n);
    for (int k=0; k < n; k++)
         result.a[k] = (int *)malloc(n * sizeof(int));

    for (int i = 0; i < n; i++) {
        for (int j = 0; j < n; j++) {
            float sum = 0;
            for (int k = 0; k < n; k++)
                sum += m1.a[i][k] * m2.a[k][j];
            result.a[i][j] = sum;
        }
    }

    return result;
}

int main(void)
{ 
    srand(time(NULL));

    matrix m1 = random_matrix(3);
    matrix m2 = random_matrix(3);

    display(m1);
    display(m2);

    printf("   RESULT    \n");
    display(multiply(m1, m1));   

    return 0;
}

1 个答案:

答案 0 :(得分:0)

令您感到困惑的rsrecsce导致&#34; 不自然&#34; rs或cs开始,以rece结束的> 1 循环是multiply中的原因

result.re = result.ce = n;

但应该是

result.re = result.ce = n - 1;

永远不要这样做,只需使用两个名为rowscolumns的指标,以及你的循环

for (int row = 0 ; row < m.rows ; ++row)
{
    for (int column = 0 ; column < m.columns ; ++column)
    {
    }
}

并完全避免混淆。

注意:您的代码中没有free(),因为每malloc()必须有一个free(),它不是一个巨大的你的代码有问题,但考虑一个长期存在的程序,如守护进程/服务(取决于你如何调用它们,但它们是相同的),小内存泄漏将成为一个主要问题。

void free_matrix(matrix *m)
{
    for (int i = m->rs ; i <= m->re ; ++i)
        free(m->a[i]);
    free(m->a);
}

1 在某种意义上说不自然,对于有经验的程序员来说,正确阅读它们并不容易,并且可能导致你正在处理的代码中的错误