下面是二维数组吗?
int *arr = (int *)malloc(rows * cols * sizeof(int));
没有。 arr 是一个指针。该指针使用适合存储二维数组的内存地址进行初始化。
我想使用指针动态分配二维数组。
这取决于“2D”的种类
“2D 数组”的概念经常被松散地使用。让我们探索一些可能的解释。
要分配指向二维数组的指针,请使用以下命令。如果rows,cols 是常量或者代码是C99,或者带有可变长度数组的C11:
int (*arr_true)[rows][cols] = malloc(sizeof *arr_true);
(*arr_true)[0][0] = this;
(*arr_true)[0][1] = that;
// etc.
为具有cols 宽度的二维数组分配内存。如果cols 是常量或者代码是C99,或者带有可变长度数组的C11:
int *arr_mem[cols] = malloc(sizeof *arr_mem * rows);
arr_mem[0][0] = this;
arr_mem[0][1] = that;
// etc.
为具有row*cols 元素的数组分配内存。
int *arr_flat = malloc(sizeof *arr_flat *rows * cols);
arr_flat[0 *cols + 0] = this;
arr_flat[0 *cols + 1] = that;
// etc.
分配一个指向int的指针数组
int *arr_classic = malloc(sizeof *arr_classic *rows);
for (size_t r = 0; r<rows; r++) {
arr_classic[r] = malloc(sizeof *arr_classic[r] *cols);
}
arr_classic[0][0] = this;
arr_classic[0][1] = this;
// etc.
尺寸计算的改进思路。
考虑用于计算大小的数学。如果rows,cols 是int,rows * cols 可能会溢出int 范围,导致未定义的行为。使用size_t 完成的相同计算可能不会在数学上溢出,应该是首选。
最后,malloc(size_t sz) 期望 size_t,
int *arrA = malloc(rows * cols * sizeof(int)); // possible int*int overflow
int *arrB = malloc(sizeof(int) * rows * cols); // preferred