如何使用int **而不是int [] []二维数组

时间:2013-12-05 02:01:40

标签: c arrays matrix dimensional

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++;
    }
}

3 个答案:

答案 0 :(得分:1)

您需要为矩阵分配空间。简单地将值分配给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);
}

答案 1 :(得分:0)

按照评论的建议,查看Dynamic Allocation of 2D Array

然后做

for (i = 0; i < m.rows; i++) {
  for (j = 0; j < m.cols; j++) {
    m.element[i][j] = q++;
  }
}

您需要添加m.element[i][j]部分才能使其正常运行。

答案 2 :(得分:0)

虽然,你不应该使用指针来存储2-D数组,但你可以这样做:

m.element = malloc(sizeof(int*)*3);
for (int j=0;j<3;++j)
{
    m.element[j] = malloc(sizeof(int)*3);
}