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

Тема в разделе "Общие вопросы по С и С++", создана пользователем StagerC, 5 янв 2009.

  1. StagerC

    StagerC Гость

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

    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;// Т.к. в Си, не контролирующем запись по нулевому адресу, после стирания нескольких первых
    элементов несуществующего массива происходит зависание операционной
    системы.
     
  3. alexsid

    alexsid Гость

    выделяется в так называемой "куче" (свободная память в адресном пространстве процесса) а не в стековой памяти.
     
  4. JORIK

    JORIK Гость

    все правильно,alexsid,спешил и начудил,простите меня
     
Загрузка...

Поделиться этой страницей