typedef struct{
int rows, cols; // matrix dimensions
int **element; // element array
}Matrix;
如果我要创建一个变量:
Matrix m;
我将如何在Matrix
中创建 3x3 {{1,2,3},{4,5,6},{7,8,9}} 数组?或者就此而言,如何将任何大小的二维数组存储到 m.element 中?
我试过:
for (i=0; i<m.rows; i++)
{
for (k=0; k<m.cols; k++)
{
m.element=q;
q++;
}
}
您需要为矩阵分配空间。简单地将值分配给m.elements[i][j]
将尝试访问未知位置的内存,因为m.elements
将未初始化并且基本上具有随机值。 您的程序可能无法访问它,或者它可能无法正确对齐。构建一个函数来创建rows
× cols
矩阵:
// Initialize and return a passed-in matrix.
// matrix must point to an allocated struct, not NULL.
void build(Matrix * const matrix, const size_t rows, const size_t cols) {
matrix->rows = rows;
matrix->cols = cols;
matrix->elements = malloc(rows * sizeof(int *));
for (size_t row = 0; row < rows; row++) {
matrix->elements[row] = malloc(cols * sizeof(int));
}
}
请注意,您可以创建任何形状的数组。 如果需要创建对称矩阵,则只需存储不在主对角线下方的项目。
由于这会动态分配二维数组,因此您有责任在完成后对其进行free
:
void destroy(Matrix * const matrix) {
for (size_t row = 0; row < matrix->rows; row++) {
free(matrix->elements[row]);
}
free(matrix->elements);
}
按照评论的建议,查看 2D 数组的动态分配
然后做
for (i = 0; i < m.rows; i++) {
for (j = 0; j < m.cols; j++) {
m.element[i][j] = q++;
}
}
您需要添加m.element[i][j]
部分才能使其正常工作。
虽然,你不应该使用指针到指针来存储二维数组,但你可以执行以下操作:
m.element = malloc(sizeof(int*)*3);
for (int j=0;j<3;++j)
{
m.element[j] = malloc(sizeof(int)*3);
}