Выделение матрицы в C - PullRequest
0 голосов
/ 16 июня 2019

Я сейчас пытаюсь выучить и понять C, и я застрял в понимании указателей.

Для присвоения мы должны выделить матрицу следующим образом:

int main(){

    int *mat = (int *)malloc(rows * cols * sizeof(int));
}

Однако я не понимаю, почему это должно давать какие-либо преимущества по сравнению с использованием простого массива.

Как бы я справился с этой матрицей? Каковы его преимущества?

1 Ответ

3 голосов
/ 16 июня 2019

В чем его преимущества?

Существует много различий между ними, но одно из самых больших заключается в том, что размер стека обычно составляет 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] также будет работать, если вы не смешаете их.

...