Является ли следующий двумерный массив?
int *arr = (int *)malloc(rows * cols * sizeof(int));
Нет.arr
это указатель.Этот указатель инициализируется с адресом памяти, подходящим для хранения 2D-массива.
Я хотел динамически распределить 2D-массив с помощью указателей.
Itзависит от вида "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.
Чтобы выделить память для 2D-массива с шириной 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