Как работает malloc. Выделение памяти в Си (функция malloc)

void free(void *pointer);

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

_msize

Функция _msize возвращает размер область памяти, выделенной из кучи:

size_t _msize (void*);

аргумент - указатель на блок памяти. Функция _msize возврашает размер памяти в байтах. size_t - это unsigned integer.

malloc

Функция malloc выделяет область памяти из «кучи» (т.е. свободной области памяти):

void* malloc(size_t);

аргумент определяет количество байтов, которое надо выделить из памяти. Функция malloc возвращает void указатель на выделенную область памяти, его можно привести к нужному типу. Если свободной для выделения памяти меньше, чем затребовоно в size_t, то функция malloc вернет NULL.

Пример работы с функцией malloc:

/* Author: @author Subbotin B.P..h> #include #include int main(void) { puts(«Memory»); int *pointer; puts(«to get memory»); pointer = (int*)malloc(2 * sizeof(int)); int memorySize = _msize(pointer); printf(«memory size = %dn», memorySize); if(pointer == NULL) { puts(«Problems»); return EXIT_FAILURE; } free(pointer); puts(«to free memory»); return EXIT_SUCCESS; }

здесь выделено место в памяти для массива, состоящего из двух элементов типа int. Если выделение памяти пошло успешно, то освобождаем эту область памяти с помощью функции free.

Получаем:

calloc

Функция calloc выделяет область памяти и размещает в ней массив, инициализированный нулями:

void* calloc(size_t, size_t);

первый аргумент количество элементов, а второй - размер в байтах одного элемента. Произведение значений аргуменов и даст величину области памяти, запрошенной для выделения. Функция calloc возвращает void указатель на выделенную область памяти, его можно привести к нужному типу. Если свободной для выделения памяти меньше, чем затребовоно, то функция calloc вернет NULL.

Пример работы с функцией calloc:

/* Author: @author Subbotin B.P..h> #include #include int main(void) { puts(«Memory»); int *pointer; puts(«to get memory»); pointer = (int*)calloc(2, sizeof(int)); int memorySize = _msize(pointer); printf(«memory size = %dn», memorySize); if(pointer == NULL) { puts(«Problems»); return EXIT_FAILURE; } free(pointer); puts(«to free memory»); return EXIT_SUCCESS; }

в примере выделяется память для массива типа int, содержащего два элемента. Эти элементы инициализированны нулями. Если выделение памяти пошло успешно, то освобождаем эту область памяти с помощью функции free.

Получаем:

realloc

Функция realloc меняет размер предварительно выделенной области памяти:

void* realloc(void*, size_t);

первый аргумент - это указатель на область памяти, размер которой нужно изменить, второй аргумент определяет новый размер области памяти. Если этот размер равен нулю, а первый аргумент указывает на имеющуюся область памяти, то функция realloc вернет NULL, а исходный блок памяти, на который указывает первый аргумент, будет освобожден. Если свободной для выделения памяти меньше, чем затребовоно, то функция realloc вернет NULL, а исходный блок памяти, на который указывает первый аргумент, сохраниться и останется без изменений. Функция realloc возвращает void указатель на выделенную область памяти, его можно привести к нужному типу.


#include void *malloc(size_t size);

Описание


Возвращает указатель на первый байт области памяти, которая была выделена из кучи


Функция malloc() возвращает указатель на первый байт области памяти размером size, которая была выделена из кучи. Если для удовлетворения запроса нет достаточного объема памяти, возвращается нулевой указатель. Важно всегда удостовериться, что возвращаемое значение не является нулевым указателем. Попытка использовать нулевой указатель обычно приводит к полному отказу системы.

Если вы пишете 16-разрядные программы для семейства процессоров 8086(например, 80486 или Pentium), то ваш компилятор, вероятно, предоставляет дополнительные функции выделения памяти, которые учитывают модель сегментированной памяти, используемую этими процессорами при работе в 16-разрядном режиме. Например, это могут быть функции, выделяющие память FAR-кучи(которая находится вне стандартного сегмента данных). Эти функции могут назначать указатели на память, объем которой больше одного сегмента, и освобождать такую память.

  • описать указатель (тип * указатель; );
  • определить размер массива;
  • выделить участок памяти для хранения массива и присвоить указателю адрес этого участка памяти.

Для выделения памяти в С++ можно воспользоваться оператором new или функциями языка С - calloc, malloc, realloc . Все функции находятся в библиотеке stdlib.h .

5.2.1 Функция malloc

Функция malloc выделяет непрерывный участок памяти размером size байт и возвращает указатель на первый байт этого участка. Обращение к функции имеет вид:

void* malloc (size_t size);

где size - целое беззнаковое значение 1size_t - базовый беззнаковый целочисленный тип языка С/С++, который выбирается таким образом, чтобы в него можно было записать максимальный размер теоретически возможного массива любого типа. В 32-битной операционной системе size_t является беззнаковым 32-битным числом (максимальное значение 2 32 - 1), в 64-битной - 64-битным беззнаковым числом (максимальное значение 2 64 - 1). , определяющее размер выделяемого участка памяти в байтах. Если резервирование памяти прошло успешно, то функция возвращает переменную типа void* , которую можно преобразовать к любому необходимому типу указателя. Если выделить память невозможно, то функция вернёт пустой указатель NULL .

Например,

double *h; //Описываем указатель на double. int k; cin>>k; //Ввод целого числа k. //Выделение участка памяти для хранения k элементов типа double. //Адрес этого участка хранится в переменной h. h=(double *) malloc (k* sizeof (double)); //h - адрес начала участка памяти, //h + 1, h + 2, h + 3 и т. д. - адреса последующих элементов типа double

5.2.2 Функция calloc

Функция calloc предназначена для выделения и обнуления памяти.

void * calloc (size_t num, size_t size);

С помощью функции будет выделен участок памяти, в котором будет храниться num элементов по size байт каждый. Все элементы выделенного участка обнуляются. Функция возвращает указатель на выделенный участок или NULL при невозможности выделить память.

Например,

float *h; //Описываем указатель на float. int k; cin>>k; //Ввод целого числа k. //Выделение участка памяти для хранения k элементов типа float. //Адрес этого участка хранится в переменной h . h=(float *) calloc (k, sizeof (float)); //h - адрес начала участка памяти, //h + 1, h + 2, h + 3 и т. д. - адреса последующих элементов типа float.

5.2.3 Функция realloc

Функция realloc изменяет размер ранее выделенного участка памяти. Обращаются к функции так:

void *realloc (void *p, size_t size);

где p - указатель на область памяти, размер которой нужно изменить на size . Если в результате работы функции меняется адрес области памяти, то новый адрес вернётся в качестве результата. Если фактическое значение первого параметра NULL , то функция realloc работает так же, как и функция malloc , то есть выделяет участок памяти размером size байт.

5.2.4 Функция free

Для освобождения выделенной памяти используется функция free . Обращаются к ней так:

void free (void *p);

где p - указатель на участок памяти, ранее выделенный функциями malloc, calloc или realloc .

5.2.5 Операторы new и delete

В языке С++ есть операторы new для выделения и delete для освобождения участка памяти.

Для выделения памяти для хранения n элементов одного типа оператор new имеет вид [

Описание функций

#include void * malloc (size_t size) ; void * calloc (size_t num, size_t size) ;

Назначение

malloc принимает в качестве аргумента размер выделяемой области в байтах ; возвращает нетипизированный указатель (void*) на область памяти заявленного размера или NULL в случае, если выделить память невозможно. Содержимое выделяемой области памяти не определено.

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

Параметры функций

malloc

  • size - размер распределяемой области памяти

calloc

  • num - количество распределяемых элементов
  • size - размер каждого элемента

Возвращаемое значение

Функции возвращают нетипизированный (void*) указатель на область памяти в случае успеха, либо NULL в противном случае.

Характерные ошибки при использовании

  • Память остаётся «занятой», даже если ни один указатель в программе на неё не ссылается (для освобождения памяти используется функция free()). Накопление «потерянных» участков памяти приводит к постепенной деградации системы. Ошибки, связанные с неосвобождением занятых участков памяти, называются утечками памяти (англ. memory leaks ).
  • Если объём обрабатываемых данных больше, чем объём выделенной памяти, возможно повреждение других областей динамической памяти. Такие ошибки называются ошибками переполнения буфера (англ. buffer overflow ).
  • Если указатель на выделенную область памяти после освобождения продолжает использоваться, то при обращении к «уже не существующему» блоку динамической памяти может произойти исключение (англ. exception ), сбой программы, повреждение других данных или не произойти ничего (в зависимости от типа операционной системы и используемого аппаратного обеспечения).
  • Если для одной области памяти free() вызывается более чем один раз, то это может повредить данные самой библиотеки , содержащей malloc/free, и привести к непредсказуемому поведению в произвольные моменты времени.
  • Неудачная организация программы, в которой выделяется и освобождается множество небольших объёмов памяти - возможна фрагментация свободной памяти («пунктир»), при которой свободной памяти в сумме остаётся много, но выделить большой кусок невозможно.

Точное поведение функций описано в стандарте ANSI C , на него же ссылается определение функции в стандарте POSIX .

Примеры использования

malloc

Float * dynamic_array = malloc(number_of_elements * sizeof (float ) ) ; if (! dynamic_array) { }

calloc

Float * dynamic_array = calloc(number_of_elements, sizeof (float ) ) ; if (! dynamic_array) { /* обработка ошибки выделения памяти */ } /* … работа с элементами массива … */ free(dynamic_array) ; dynamic_array = NULL;

См. также

  • stdlib
  • alloca
  • soap malloc
  • soap destroy

Источники

  • malloc (англ.) . - Описание функции malloc в стандарте POSIX.
  • calloc (англ.) . - Описание функции calloc в стандарте POSIX.

Wikimedia Foundation . 2010 .

Смотреть что такое "Malloc" в других словарях:

    Malloc - est en informatique une fonction de la bibliothèque standard du C permettant d allouer dynamiquement de la mémoire. La libération de la mémoire ainsi réservée s effectue avec la fonction free. Cette fonction est déclarée dans le fichier d en tête … Wikipédia en Français

    malloc - est en informatique une fonction de la bibliothèque standard de C permettant d allouer dynamiquement de la mémoire. La libération de la mémoire ainsi réservée s effectue avec la fonction free. Cette fonction est déclarée dans l en tête

    Malloc - In computing, malloc is a subroutine provided in the C and C++ programming language s standard libraries for performing dynamic memory allocation. Rationale The C programming language manages memory either statically or automatically . Static… … Wikipedia

    Malloc - En informática, malloc es una subrutina para el ejercicio de asignación de memoria dinámica en los lenguajes de programación C y C++. Es una abreviatura del inglés Memory Allocation. Forma parte de la biblioteca estándar stdlib.h para ambos… … Wikipedia Español

    malloc - 1. noun A subroutine in the C programming languages standard library for performing dynamic memory allocation. It compares the behavior of nine different mallocs when used with Hummingbird and GNU Emacs dynamic memory activity traces. 2. verb … Wiktionary

    malloc - ● np. cde. LANGC CMDE Contraction de Memory Allocation. Nom d une fonction très importante de la bibliothèque C, car elle permet d attribuer une partie de la mémoire à un processus. Voir aussi calloc. (D après ) … Dictionnaire d"informatique francophone

    C dynamic memory allocation - C Standard Library Data types Character classification Strings Mathematics File input/output Date/time Localization … Wikipedia

    Pointer (computing) - This article is about the programming data type. For the input interface (for example a computer mouse), see Pointing device. Pointer a pointing to the memory address associated with variable b. Note that in this particular diagram, the computing … Wikipedia

    Значимость предмета статьи поставлена под сомнение. Пожалуйста, покажите в статье значимость её предмета, добавив в неё доказательства значимости по частным критериям значимости или, в случае если частные критерии значимости для… … Википедия

    Dangling pointer - Dangling pointers and wild pointers in computer programming are pointers that do not point to a valid object of the appropriate type. These are special cases of memory safety violations. Dangling Pointer Dangling pointers arise when an object is… … Wikipedia