В чем его преимущества?
Существует много различий между ними, но одно из самых больших заключается в том, что размер стека обычно составляет 1 МБ или 8 МБ. Поэтому, если вы попытаетесь объявить массив такого размера, программа, вероятно, завершится сбоем. С динамической памятью нет ничего удивительного в том, чтобы выделять сотни и более МБ.
Другое большое отличие состоит в том, что вы можете возвращать указатели на динамически выделяемую память. Это не будет работать с массивами.
// Dummy init function
void init(int * arr, size_t size)
{
for(int i=0; i<size; i++) arr[i] = i;
}
// Will compile, but the program will behave strange. Accessing a variable
// after it has gone out of scope causes undefined behavior.
int * returnArray()
{
int arr[10];
init(arr, 10);
return arr;
}
// Works perfectly;
int * returnMallocatedArray()
{
int * arr = malloc(10*sizeof(*arr));
init(arr, 10);
return arr;
}
Как бы я справился с этой матрицей?
Так же, как обычный массив. Вы можете получить доступ к элементу (x, y), например, mat[x+y*rows]
или к чему-либо, что вам больше подходит Просто помните, что, что касается среды компилятора и среды выполнения, mat
- это только указатель на кусок памяти. Это зависит от вас, чтобы сделать отображение. Выполнение чего-то вроде mat[x*cols+y]
также будет работать, если вы не смешаете их.