Пространства имён
Варианты
Действия

malloc

Материал из cppreference.com
< c‎ | memory
Определено в заголовочном файле <stdlib.h>
void *malloc( size_t size );

Выделяет size байт неинициализированной памяти.

При успешном выделении возвращает указатель, выравненный подходящим образом для объекта любого типа с помощью фундаментального выравнивания.

Если size равен нулю, то поведение malloc зависит от реализации. Например, может быть возвращён нулевой указатель. Также может быть возвращён и ненулевой указатель; однако такой указатель не должен разыменовываться, и должен быть передан в функцию free, чтобы избежать утечек памяти.

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

Предшествующий вызов free или realloc, который освобождает область памяти синхронизируется с вызовом malloc, который выделяет ту же или часть той же области памяти. Эта синхронизация выполняется после любого доступа к памяти с помощью освобождающей функции и перед любым доступом к памяти с помощью malloc. Существует единственный полный порядок всех выделяющих и освобождающих функций, оперирующих своей собственной областью памяти.

(начиная с C11)

Содержание

[править] Параметры

size количество выделяемых байтов

[править] Возвращаемое значение

При успехе возвращает указатель на начало вновь выделенного блока памяти. Чтобы избежать утечек памяти, возвращённый указатель должен быть освобождён с помощью free() или realloc().

При отказе возвращает нулевой указатель.

[править] Пример

#include <stdio.h>   
#include <stdlib.h> 
 
int main(void) 
{
    int *p1 = malloc(4*sizeof(int));  // выделяет достаточно памяти для массива из 4-х значений типа int
    int *p2 = malloc(sizeof(int[4])); // то же самое с явным указанием типа данных
    int *p3 = malloc(4*sizeof *p3);   // то же самое без повторения типа данных
 
    if(p1) {
        for(int n=0; n<4; ++n) // заполнение массива
            p1[n] = n*n;
        for(int n=0; n<4; ++n) // вывод
            printf("p1[%d] == %d\n", n, p1[n]);
    }
 
    free(p1);
    free(p2);
    free(p3);
}

Вывод:

p1[0] == 0
p1[1] == 1
p1[2] == 4
p1[3] == 9

[править] Ссылки

  • Стандарт C17 (ISO/IEC 9899:2018):
  • 7.22.3.4 Функция malloc (стр. 254)
  • Стандарт C11 (ISO/IEC 9899:2011):
  • 7.22.3.4 Функция malloc (стр. 349)
  • Стандарт C99 (ISO/IEC 9899:1999):
  • 7.20.3.3 Функция malloc (стр. 314)
  • Стандарт C89/C90 (ISO/IEC 9899:1990):
  • 4.10.3.3 Функция malloc

[править] См. также

освобождает ранее выделенную память
(функция) [править]