如何使用 int ** 代替 int [][] 二维数组

Posted

技术标签:

【中文标题】如何使用 int ** 代替 int [][] 二维数组【英文标题】:how to use int ** instead of int [][] two dimensional array 【发布时间】:2013-12-05 02:01:39 【问题描述】:
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++;
    

【问题讨论】:

引用这个[二维数组的动态分配][1][1]:***.com/questions/17583836/… ***.com/questions/19572696/read-and-write-matrix/… 【参考方案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);

【讨论】:

好吧,你的回答比我的好。【参考方案2】:

听从评论的建议,看看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] 部分才能使其工作。

【讨论】:

那行不通。 m.element 不会被初始化为任何有用的东西。 m.element[i] 甚至可能导致分段错误。 m.element[i][j] 一定会的。 否;关键是您需要为指针数组分配足够的空间,然后为每一行您需要为其元素分配足够的空间。我会在下面回答。【参考方案3】:

虽然,您不应该使用指向指针的指针来存储二维数组,但您可以执行以下操作:

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

    m.element[j] = malloc(sizeof(int)*3);

【讨论】:

这里的一个潜在问题是数据的局部性。根据 OP 如何迭代矩阵(我不知道他的代码对性能有多敏感),他会更好地分配一个大内存块并进行行/列数学来查找每个元素(matrix[y * cols + x @EdS。好点子。没想到。但是他可能不得不将他的元素从**更改为*,对吧? typedef struct 不能更改,必须是** 我猜这是学生的问题。 @runnercto:那么性能并不重要,你可以这样做

以上是关于如何使用 int ** 代替 int [][] 二维数组的主要内容,如果未能解决你的问题,请参考以下文章

Java:Effective java学习笔记之 用enum代替int常量

关于金额,重量等浮点数的数据库字段设计(用Int,Long代替浮点数计算)

vector代替数组

2020春招字节跳动二面

什么是 uint_fast32_t,为什么要使用它来代替常规的 int 和 uint32_t?

请问在C程序中啥时候用int main() 啥时候用 void main()。二者是不是可以相互代替?