массивы являются статической структурой данных.Тогда как память может быть выделена им динамически? - PullRequest
0 голосов
/ 05 октября 2018

Статический тип данных - это тип данных с фиксированным размером в памяти.Поскольку мы заранее объявляем размер массива, то столько байтов или места зарезервировано в памяти и не может быть увеличено позже.Таким образом, массив представляет собой статический тип данных.

ОК.но мы можем динамически распределять память для массивов, используя указатели или массив указателей.Я не понимаю всю концепцию ясно.Пожалуйста, помогите

Ответы [ 2 ]

0 голосов
/ 05 октября 2018

Насколько я понимаю, у вас есть некоторые трудности в понимании разницы между массивом и динамической памятью.

Каждый раз, когда вы объявляете массив, например:

char array[10];

Вы выделяете 10 chars (то есть большую часть времени 10 байтов) в стеке.

Но у программы есть не только стек для размещения данных, но и куча.Поскольку размер массива известен во время компиляции, он может быть уже выделен.Но что произойдет, если объем памяти неизвестен при компиляции и должен быть распределен динамически?Затем вы можете выделить необходимую память в куче и иметь указатель в стеке.Например:

char *ptr;

Распределяет указатель в стеке, и после этого вы можете выделить необходимую память в куче, используя malloc (или calloc):

ptr = malloc(10 * sizeof (char));

Это выделит10 байт памяти в куче.

С одной стороны, массивы освобождаются автоматически при освобождении стека, с другой стороны, память, выделенная в куче, должна быть явно освобождена, иначе может возникнуть утечка памяти.

Еще одно замечание: при запуске нескольких потоков каждый поток имеет свой собственный стек, но все они совместно используют одну и ту же кучу.Хотя при запуске нескольких процессов каждый процесс имеет свой собственный стек и кучу.

0 голосов
/ 05 октября 2018

Понятия:

// example 1
int array1[256];  // a fixed size, global array of 256 ints, statically allocated

void example2(void)
{
    int array2[256];  // an array of fixed size 256, allocated when the function is entered
    //...
    //...             // and automatically released (deallocated) when the function exits
}

void example3(int n)
{
    int array3[n];    // an array of fixed size n, allocated when the function is entered
    //...
    //...             // and automatically released (deallocated) when the function exits
}

void example4(int n)
{
    int *array4;
    array4= malloc(n*sizeof(int));  // a dynamically allocated array
    //...
    free(array4);  // that must be manually deallocated when no longer needed
}

В первом примере размер массива определяется во время компиляции и фиксируется во время выполнения программы.Массив находится в глобальной памяти в течение всего выполнения программы.

Во 2-м примере размер массива также определяется во время компиляции и остается фиксированным во время выполнения программы, но памятьвыделяется в стеке при входе в функцию.Таким образом, в рекурсивной функции одновременно может существовать более одного экземпляра этого массива.

В третьем примере используются массивы переменного размера более поздних стандартов Си (VLA).Размер массива фиксирован во время выполнения функции, но может меняться при каждом вызове функции.Если n велико, вы можете легко исчерпать пространство стека, что приведет к сбою программы.

В 4-м примере динамически выделяются массивы из кучи с использованием указателей.При перераспределении массива его размер может меняться также во время вызова функции.Куча часто намного больше стека, поэтому для больших массивов этот метод предпочтительнее.Поскольку массив не находится в стеке, вы можете вернуть его вызывающей стороне (которая затем должна позаботиться об освобождении его, когда он больше не нужен).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...