• Курсы Академии Кодебай, стартующие в мае - июне, от команды The Codeby

    1. Цифровая криминалистика и реагирование на инциденты
    2. ОС Linux (DFIR) Старт: 16 мая
    3. Анализ фишинговых атак Старт: 16 мая Устройства для тестирования на проникновение Старт: 16 мая

    Скидки до 10%

    Полный список ближайших курсов ...

Разница между динамическим массивом и нединамическим.

  • Автор темы StagerC
  • Дата начала
S

StagerC

Подскажите в чём разница между динамическим массивом и нединамическим.
Если можно, то с примером.
 
J

JORIK

динамические массивы выделяются в Стековой памяти (локальные объекты, параметры функций, возвращаемые
значения ):
- содержит произвольные значения;
- может быть "коррумпирована"(повреждена);
- время жизни ограничено., а статические в статической памяти
статические массивы выделяются в статической памяти(Статическая (глобальные объекты, статические переменные):
- выделяется на этапе построения (build-time);
- размер фиксирован и ограничен;
- размер не может быть изменен во время выполнения;
- обнуляется.
Разница в том,что очень часто мы не знаем размер исходного масива или структуры(и т.д.),поэтому выделяем память уже в процессе построения программы,например в создании списков
Вот функция, создающая список "книг"( у меня такая структура)
struct BOOK
{
char title[30];
char author[30];
int pages;
};
struct ITEM
{
BOOK *book;
ITEM *next;
};


ITEM *createList(BOOK *book)
{
ITEM *head=(ITEM*)malloc(sizeof(ITEM));
// ITEM *head=new ITEM; //(С++)
head->book=book;
head->next=NULL;
return head;
}

Тебе бы взять книжку какую,да почитать,просто писать слишком долго.
Вот тебе статья из "Изучаем Си"(Крупник)

Копирование строк
Если работа с malloc() и free() так опасна, то, может
быть, вообще не стоит пользоваться этими функциями, а
лучше задавать массивы привычным способом: int
p[1000000]?
К сожалению, память, занятую таким массивом, нельзя
освободить, кроме того, нельзя изменить и размер массива в
процессе выполнения программы. Поэтому говорят, что так
задается «статический массив». Но далеко не всегда известен
точный размер массива, и чтобы программа работала, нужно
задавать его «с запасом», что некрасиво и расточительно.
В отличие от статического массива, задание динамического
массива с помощью функции malloc() позволяет выделить
ровно столько памяти, сколько нужно, а функция free()
освобождает память сразу же, как только нужда в ней отпадет.

p.s. при построении даже простейших баз данных(не говоря уже о хеш-таблицах с сотнями тысяч элементов) при входном потоке будут поступать данные различной величины,и для создания статических массивов не будет хватать памяти,причем даже ты не будешь знать,сколько памяти эти данные будут занимать.

Я тебе тут вообще говорю о динамическом выделении памяти,не только о массивах!

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

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

Кстати,вот выделение памяти под статический массив:

int A[N]; //при условии что у тебя уже есть размерность(или define,или при вводе с клавиатура scanf)
а это динамическое выделение памяти
int *arr = (int *)calloc(N,sizeof(int));
или вот так:
int *arr = (int *)malloc(N*sizeof(int));
освобождение памяти
free(arr);
arr = NULL;// Т.к. в Си, не контролирующем запись по нулевому адресу, после стирания нескольких первых
элементов несуществующего массива происходит зависание операционной
системы.
 
A

alexsid

динамические массивы выделяются в Стековой памяти (локальные объекты, параметры функций, возвращаемые
значения ):
выделяется в так называемой "куче" (свободная память в адресном пространстве процесса) а не в стековой памяти.
 
J

JORIK

все правильно,alexsid,спешил и начудил,простите меня
 
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!