在C中分配矩阵

Ida*_*dan 14 c malloc pointers matrix

我想分配一个矩阵.

这是唯一的选择:

int** mat = (int**)malloc(rows * sizeof(int*))

for (int index=0;index<row;++index)
{
    mat[index] = (int*)malloc(col * sizeof(int));
}
Run Code Online (Sandbox Code Playgroud)

jas*_*son 28

好吧,你没有给我们一个完整的实现.我认为你的意思.

int **mat = (int **)malloc(rows * sizeof(int*));
for(int i = 0; i < rows; i++) mat[i] = (int *)malloc(cols * sizeof(int));
Run Code Online (Sandbox Code Playgroud)

这是另一种选择:

int *mat = (int *)malloc(rows * cols * sizeof(int));
Run Code Online (Sandbox Code Playgroud)

然后,使用模拟矩阵

int offset = i * cols + j;
// now mat[offset] corresponds to m(i, j)
Run Code Online (Sandbox Code Playgroud)

用于行主要排序和

int offset = i + rows * j;
// not mat[offset] corresponds to m(i, j)
Run Code Online (Sandbox Code Playgroud)

用于列主要排序.

这两个选项中的一个实际上是在C中处理矩阵的首选方法.这是因为现在矩阵将连续存储在内存中,并且您将受益于引用的局部性.基本上,CPU缓存会让你更开心.

  • 如果您的编译器支持可变长度数组,或者“ cols”是编译时常量,则您甚至不需要自己计算偏移量;如果使用`int(* mat)[cols] = malloc(rows * sizeof * mat)`,则可以通过`mat [i] [j]`访问元素,但仍使用连续的内存块 (2认同)
  • 即使忽略性能,单个分配也是优选的,因为它更简单.以后重新分配的内容较少,并且不需要处理部分分配失败. (2认同)

jam*_*lin 6

其他答案已经涵盖了这些,但为了完整起见,comp.lang.c FAQ有一个相关的条目:

如何动态分配多维数组?


小智 5

你能做的是

int (*mat)[col];
mat=(int (*)[col])malloc(sizeof(*mat)*row);
Run Code Online (Sandbox Code Playgroud)

然后使用这个新矩阵作为 mat[i][j]