Skip to main content
LibreTexts - Ukrayinska

12.3: Виділення пам'яті

  • Page ID
    29518
  • \( \newcommand{\vecs}[1]{\overset { \scriptstyle \rightharpoonup} {\mathbf{#1}} } \) \( \newcommand{\vecd}[1]{\overset{-\!-\!\rightharpoonup}{\vphantom{a}\smash {#1}}} \)\(\newcommand{\id}{\mathrm{id}}\) \( \newcommand{\Span}{\mathrm{span}}\) \( \newcommand{\kernel}{\mathrm{null}\,}\) \( \newcommand{\range}{\mathrm{range}\,}\) \( \newcommand{\RealPart}{\mathrm{Re}}\) \( \newcommand{\ImaginaryPart}{\mathrm{Im}}\) \( \newcommand{\Argument}{\mathrm{Arg}}\) \( \newcommand{\norm}[1]{\| #1 \|}\) \( \newcommand{\inner}[2]{\langle #1, #2 \rangle}\) \( \newcommand{\Span}{\mathrm{span}}\) \(\newcommand{\id}{\mathrm{id}}\) \( \newcommand{\Span}{\mathrm{span}}\) \( \newcommand{\kernel}{\mathrm{null}\,}\) \( \newcommand{\range}{\mathrm{range}\,}\) \( \newcommand{\RealPart}{\mathrm{Re}}\) \( \newcommand{\ImaginaryPart}{\mathrm{Im}}\) \( \newcommand{\Argument}{\mathrm{Arg}}\) \( \newcommand{\norm}[1]{\| #1 \|}\) \( \newcommand{\inner}[2]{\langle #1, #2 \rangle}\) \( \newcommand{\Span}{\mathrm{span}}\)

    Щоб використовувати процедури пам'яті, включіть заголовок stdlib.h у свій код і обов'язково зв'яжіться зі стандартною бібліотекою. Є дві основні функції розподілу пам'яті. Ними є танос () і каллок (). Ось їх прототипи:

    void * malloc( unsigned int size );
    void * calloc( unsigned int num_item, unsigned int item_size );
    

    malloc () приймає один аргумент: кількість байтів, які ви хочете виділити з вільного пулу. calloc () приймає два аргументи: кількість елементів, які потрібно вмістити в блок пам'яті і їх розмір в байтах. В основному, calloc () просто викликає malloc () після множення двох аргументів разом. Використовується для зручності. Обидві функції повертають покажчик на тип void. Що це таке? Покажчик порожнечі можна розглядати як загальний, один розмір підходить для всіх покажчик. Це запобігає можливим зіткненням розміру типу. Ви можете призначити покажчик void іншому типу покажчика і не отримати невідповідність типу. Якщо запит пам'яті не може бути зроблений (недостатньо пам'яті), то функції повернуть NULL. Завжди перевіряйте на повернення NULL! Ніколи не думайте, що виділення спрацюють!

    Якщо ви хочете отримати простір для 100 байт, ви зробите щось на зразок цього:

    char *cp;
    
    cp = malloc( 100 );
    if( cp )
    {
        /* memory allocated, do stuff... */
    } else
    {
        /* not allocated, warn user and fail gracefully... */
    }
    

    Якщо вам потрібно місце для 200 дублів, ви зробите щось подібне:

    double *dp;
    
    if( dp = calloc( 200, sizeof(double) ) ) /* assign and if test in 1 */
    {
        /* memory allocated, do stuff... */
    }
    else {
        /* not allocated, warn user and fail gracefully... */
    }
    

    Зверніть увагу на використання оператора sizeof () вище. Якщо у вас була структура і вам потрібно було її створити (наприклад, додати до зв'язаного списку), ви можете зробити це:

    struct foo *fp;
    
    if( fp = calloc( 1, sizeof(struct foo) ) )
    {
        /* remainder as above ... */