Подтвердить что ты не робот

Когда и зачем использовать malloc?

Ну, я не могу понять, когда и зачем нужно выделять память с помощью malloc.

Вот мой код:

#include <stdlib.h>

int main(int argc, const char *argv[]) {

  typedef struct {
    char *name;
    char *sex;
    int age;
  } student;


  //Now I can do two things
  student p;

  //or
  student *ptr = (student *)malloc(sizeof(student));

  return 0;
}

Зачем нужно выделять память, когда я могу просто использовать student p;?

4b9b3361

Ответ 1

malloc используется для распределения динамической памяти. Как сказано, это динамическое распределение, что означает, что вы выделяете память во время выполнения. Например, когда вы не знаете объем памяти во время компиляции.

Один пример должен устранить это. Скажите, вы знаете, что будет максимум 20 студентов. Таким образом, вы можете создать массив со статическими 20 элементами. В вашем массиве будет максимум 20 учеников. Но что, если вы не знаете количество студентов? Скажем, первый вход - это количество студентов. Это может быть 10, 20, 50 или что-то еще. Теперь вы будете вводить n = количество студентов во время выполнения и динамически выделять эту динамическую память с помощью malloc.

Это только один пример. Существует много ситуаций, в которых требуется динамическое распределение.

Посмотрите справочную страницу malloc (3).

Ответ 2

Вы используете malloc, когда вам нужно выделять объекты, которые должны существовать вне области текущего блока (где также будет стоить копирование по возврату), или если вам нужно выделить память больше, чем размер этого стека (т.е. локальный массив стека 3 МБ - плохая идея).

Прежде чем C99 представила VLA, вам также понадобилось выполнить распределение массива с динамическим размером, однако его необходимо для создания динамических структур данных, таких как деревья, списки и очереди, которые используются многими системами. есть, вероятно, еще много причин, это всего лишь несколько.

Ответ 3

Немного разложим структуру примера, рассмотрим следующее:

#include <stdio.h>

int main(int argc, const char *argv[]) {

typedef struct {
 char* name;
 char* sex;
 char* insurace;
 int age;
 int yearInSchool;
 float tuitionDue;
}student;


//Now I can do two things
student p;

//or
student *p = (student *)malloc(sizeof(student));

return 0
}

C a - это язык, который неявно передается по значению, а не по ссылке. В этом примере, если мы передали 'p' функции, чтобы выполнить некоторую работу над ней, мы будем создавать копию всей структуры. Это использует дополнительную память (общее количество пространства, которое потребуется определенной структуре), медленнее и потенциально не масштабируется (подробнее об этом через минуту). Однако, проходя мимо * p, мы не передаем всю структуру. Мы передаем только адрес в памяти, который ссылается на эту структуру. Объем передаваемых данных меньше (размер указателя), поэтому операция выполняется быстрее.

Теперь, зная это, представьте себе программу (например, информационную систему ученика), которая должна будет создавать и управлять набором записей в тысячах или даже десятках тысяч. Если вы передадите всю структуру по значению, потребуется больше времени для работы с набором данных, чем просто передать указатель на каждую запись.

Ответ 4

malloc = Память ALLOCATION.

Если вы прошли через другие языки программирования, возможно, вы использовали ключевое слово "новое".

Malloc делает то же самое в C. Он принимает параметр, какой размер памяти должен быть выделен и он возвращает переменную указателя, которая указывает на первый блок памяти

весь блок памяти, который вы создали в памяти. Пример -

int *p = malloc(sizeof(int)*10);

Теперь * p будет указывать на первый блок целочисленного 20 целых блоков, зарезервированных в памяти.

Вы можете проходить через каждый блок с помощью оператора ++ и -. Все лучшее.

Ответ 5

В этом примере это кажется совершенно бесполезным. Но теперь представьте, что вы используете сокеты или файл IO и должны читать пакеты с переменной длиной, которые вы можете только отсрочить во время работы. Или при использовании сокетов и каждого клиентского подключения требуется некоторое хранилище на сервере. Вы можете создать статический массив, но это даст вам ограничение клиента, которое будет сдерживаться при компиляции.