在C中添加两个二维数组

时间:2013-12-05 04:07:35

标签: c matrix

我从:

开始
 typedef struct
{
    int rows, cols;
    int **element;
}Matrix;

我创建了两个矩阵:

void matrixInit (Matrix *m, int r, int c )
{
    m->element = malloc(sizeof(int*)*r);
    for (int j=0;j<3;++j)
    {
        m->element[j] = malloc(sizeof(int)*c);
    }
    m->rows=r;
    m->cols=c;
 }
Matrix m1,m2,m3;
matrixInit(&m1,3,3);
    for (k=0; k<m1.cols*m1.rows; k++)
        {
            m1.element[k]=q;
            q++;
        }

然后我使用创建的复制功能

进行矩阵2
void matrixCopy (Matrix *m, Matrix *n )
{
    int r=n->rows,c=n->cols,k;
    for (k=0; k<r*c; k++)
    {
        m->element[k]=n->element[k];
    }
}

matrixInit(&m2, 3, 3);
matrixCopy(&m2, &m1);

然后我创建第三个作为添加的结果

matrixInit(&m3, 3, 3);

然后我做了补​​充。这是我的问题所在。我似乎无法让这个工作。

我的功能代码如下: (原型必须保持不变)

Matrix* matrixAdd (Matrix *m, Matrix *n )
{
    int q;
    for (q=0; q<m->rows*m->cols; q++)
    {
        m->element[q]=*m->element[q]+*n->element[q];
    }
    return m;
}
m3=*matrixAdd(&m1, &m2);

1 个答案:

答案 0 :(得分:1)

matrixAdd函数应如下所示:元素上的*仅引用第一个值。

Matrix* matrixAdd (Matrix *m, Matrix *n )
{
    int q;
    int r;
    for(r = 0; r<m->rows; ++r)
       for (q=0; q<m->cols; q++)
       {
           m->element[r][q]=m->element[r][q]+n->element[r][q];
       }

    return m;
}

这将更易于理解。

在你的情况下,

   *m->element[q] = *m->element[q]+*n->element[q];

会导致你遇到问题,因为你已经将r指针分配给int *(因此是r连续元素),并且在每个指针处分配了c个整数。

因此,如果q超出r,则不定义行为。