c - 如何为二维数组动态分配连续的内存块

标签 c arrays multidimensional-array

如果我像这样分配一个二维数组 int a[N][N];它将分配一个连续的内存块。

但是如果我尝试像这样动态地做:

int **a = malloc(rows * sizeof(int*));
for(int i = 0; i < rows; i++) 
   a[i] = malloc(cols * sizeof(int));

这会在行中的元素之间保持一个单位步长,但行之间可能并非如此。

一种解决方案是将二维转换为一维,除此之外,还有其他方法吗?

最佳答案

如果您的数组维度在编译时已知:

#define ROWS ...
#define COLS ...

int (*arr)[COLS] = malloc(sizeof *arr * ROWS);
if (arr) 
{
  // do stuff with arr[i][j]
  free(arr);
}

如果您的数组维度在编译时未知,并且您使用的是支持可变长度数组的 C99 编译器或 C2011 编译器:

size_t rows, cols;
// assign rows and cols
int (*arr)[cols] = malloc(sizeof *arr * rows);
if (arr)
{
  // do stuff with arr[i][j]
  free(arr);
}

如果您的数组维度在编译时未知,并且您使用支持可变长度数组的 C99 编译器或 C2011 编译器:

size_t rows, cols;
// assign rows and cols
int *arr = malloc(sizeof *arr * rows * cols);
{
  // do stuff with arr[i * rows + j]
  free(arr);
}

关于c - 如何为二维数组动态分配连续的内存块,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13534966/

相关文章:

c - 如何找到单元格索引号在二维数组中?

c++ - 将 2D 数组传递给 C++ 函数

java - 如何检查二维矩阵是否为空?

c - Strtok 从文本文件中读取字符串

javascript - 数组的元素和长度的值未定义(从 Firebase 获取时)

c - 传递指针数组并接收错误消息

java - 用二维数组表示图形

C 读取文件到动态列表、动态字符串

c - 执行特定字符值的代码。

c - 是否可以在 C 程序中包含 shell 脚本