我从:
开始 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++;
}
然后我使用创建的复制功能
进行矩阵2void 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);
答案 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,则不定义行为。