Программирование на C

КАК ИСПОЛЬЗОВАТЬ ФУНКЦИЮ MALLOC В C

КАК ИСПОЛЬЗОВАТЬ ФУНКЦИЮ MALLOC В C
Malloc - это встроенная функция, объявленная в заголовочном файле . Malloc - это короткое имя для «распределения памяти», которое используется для динамического выделения одного большого блока непрерывной памяти в соответствии с указанным размером. Есть два типа распределения памяти: статическое и динамическое. Распределение статической памяти выполняется во время компиляции и не изменяется во время выполнения. Для этого динамическое выделение памяти выделяет память во время выполнения; мы используем malloc. Теперь дело в том, откуда исходит эта память, поэтому все динамические требования в C выполняются из памяти кучи. В основном наше приложение / программа будет иметь 3 вида памяти

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

Синтаксис:

Синтаксис malloc: (void *) malloc (size_t size). Таким образом, синтаксис говорит, что malloc требует размера, он вернет указатель в основном указатель void, а размер t определяется в как целое число без знака. Функция Malloc просто выделяет блок памяти в соответствии с размером, указанным в куче, как вы можете видеть в синтаксисе, который необходимо указать размер, и в случае успеха она возвращает указатель, указывающий на первый байт выделенной памяти, иначе возвращает NULL. Итак, задача malloc - выделить память во время выполнения.

Почему недействительный указатель:

Маллок понятия не имеет, на что указывает; это просто означает, что он не знает, какие данные будут храниться в этой ячейке памяти. Он просто выделяет память, запрошенную пользователем, не зная, какой тип данных будет храниться в памяти. Вот почему он возвращает указатель void.

Malloc просто выделяет память, после чего пользователь несет ответственность за приведение типов к соответствующему типу, чтобы его можно было правильно использовать в программе. Указатель Void - это указатель, который может указывать на любой тип данных, malloc возвращает указатель void, потому что он не знает, какой тип данных будет храниться в этой памяти.

Здесь мы просим malloc выделить 6 байтов памяти, если это будет успешным, malloc вернет указатель void. В этом случае мы должны привести его к указателю целочисленного типа, потому что мы хотим сохранить целое число в этой памяти. Здесь malloc выделяет 6 байтов памяти в куче, а адрес первого байта сохраняется в указателе ptr.

Пример программы:

Вот простой пример программы, чтобы правильно понять концепцию malloc.

Здесь вы можете видеть, что с помощью функции printf я прошу пользователя ввести количество целых чисел. Мы объявили две переменные выше i и n. Переменная n - это место, где мы будем хранить номер, введенный пользователем. После этого у нас есть функция malloc; мы хотим, чтобы malloc выделял размер, эквивалентный размеру n целых чисел. Мы умножаем размер, если int на n; это даст нам размер n целых чисел. После этого malloc вернет указатель void, и мы приводим его к целочисленному указателю, и мы сохраняем адрес в указателе ptr. Приведение типов важно, так как это хорошая практика.

Теперь, если указатель содержит NULL, это означает, что память недоступна. Поэтому мы просто выйдем из программы со статусом сбоя выхода. Если это не так, мы можем легко запустить цикл for.

Цикл будет выполняться от 0 до n-1, и мы будем просить пользователя вводить целые числа один за другим каждый раз. Внутри функции scanf есть одна запись ptr + i, поскольку мы знаем, что ptr содержит адрес первого байта памяти. Предположим, что адрес 1000, здесь i изначально равен нулю, поэтому 1000 + 0 равно 1000, поэтому в этом адресе будет сохранено наше первое целое число, а затем, когда i станет 1, поэтому 1000 + 1, который внутренне интерпретируется как (1000) +1 * 4, если я предполагаю, что размер целого числа составляет 4 байта, и он будет равен 1004, поэтому следующее целое число будет сохранено в ячейке 1004. И это будет продолжаться таким образом, адреса будут иметь вид 1000, 1004, 1008 и т. Д. Мы не используем амперсанд перед ptr + i, потому что ptr уже дает нам адрес, когда мы пишем ptr, который является просто указателем, и он содержит адрес, а не значение, поэтому нет необходимости помещать перед ним амперсанд, и эта концепция должна быть ясной.

Здесь, в этом цикле, мы просто делаем одно - выводим все целые числа на экран; очевидно, мы используем ptr + i, но здесь, в этом случае, мы разыменовываем его, потому что ptr + i представляет адрес, поэтому нам нужно разыменовать его. Если i равно 0, это будет 1000, потому что мы предполагаем, что первый адрес будет 1000, поэтому мы разыменовываем его; мы получим первое целое число, затем i, равное 1, и оно станет 1001, но интерпретируется как 1004, если размер целого числа равен 4. Очередной раз. Мы разыменовываем его, поэтому он даст нам 2nd целое число. Таким образом все работает.

Итак, это в основном простая программа, которая просит пользователей ввести n целое число, а затем мы просто отображаем эти целые числа на экране. После выполнения программы отобразится.

Сначала мы просим пользователя ввести количество целых чисел, затем пользователь вводит целые числа, и мы просто отображаем их на экране.

Заключение:

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

Счастливое динамическое выделение памяти!

SuperTuxKart для Linux
SuperTuxKart - отличная игра, созданная для того, чтобы бесплатно познакомить вас с Mario Kart в вашей системе Linux. Играть в нее довольно сложно и в...
Учебник Battle for Wesnoth
Битва за Веснот - одна из самых популярных стратегических игр с открытым исходным кодом, в которую вы можете играть сейчас. Эта игра не только очень д...
0 А.D. Руководство
Из множества существующих стратегических игр 0 A.D. удается выделиться как всеобъемлющее название и очень глубокая тактическая игра, несмотря на то, ч...