Когда malloc необходимо в C?

Я думаю, что все malloc(sizeof(structure)) можно заменить следующим образом:

char[sizeof(structure)]

Тогда, когда требуется malloc?

Ответ 1

  • Когда вы не знаете, сколько объектов вам нужно (например, связанные элементы списка);
  • когда вам нужны структуры данных размера, известные только во время выполнения (например, строки на основе неизвестного ввода); это несколько смягчается введением VLA в C99, но см. следующий пункт:
  • когда вы знаете, что во время компиляции их размер (или вы можете использовать VLA), но он слишком велик для стека (как правило, не более нескольких MB), и было бы бессмысленно делать такую ​​вещь глобальной (например, большие векторы манипулировать);
  • когда вам нужно иметь объект, время жизни которого отличается от того, какие автоматические переменные, которые ограничены областью (= > уничтожаются, когда выполнение выходит из области, в которой они объявлены), могут иметь (например, данные, которые должны быть разделен между различными объектами с разными сроками службы и удален, если их больше никто не использует).

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

Кстати, в С++ вы никогда не будете использовать malloc()/free(), но операторы new и delete.


Связанный: случай, в котором попытка работать без malloc оказалась большой проблемой.

Ответ 2

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

  • Вы не знаете во время компиляции, сколько потребуется памяти,
  • вы хотите иметь возможность перераспределять память позже (например, используя realloc),
  • вы хотите иметь возможность отбрасывать выделенную память раньше, чем ждать ее освобождения в зависимости от области вашей переменной.

Я вижу вашу точку зрения. Вы могли бы подумать, что вы всегда можете использовать декларативный синтаксис для всех этих, даже используя переменные, чтобы объявлять размер ваших пространств памяти, но это:

  • быть нестандартным,
  • дает вам меньше контроля,
  • возможно, используйте больше памяти, поскольку вам нужно будет делать копии вместо перераспределения.

Вероятно, вы поймете это вовремя, не волнуйтесь.

Кроме того, вы должны попытаться узнать больше о модели памяти. Вы не используете одинаковые пространства памяти при использовании динамического выделения и при использовании статического выделения.

Для первых указателей посетите:


Дружественный совет: Я не знаю, разрабатываете ли вы C на * NIX или Windows, но в любом случае, если вы используете gcc, я рекомендую использовать следующие флаговые компиляции, когда вы учите себя:/p >

  -Wall -ansi -pedantic -Wstrict-prototypes

Ответ 3

Вы должны прочитать о распределении динамической памяти. Вы, очевидно, не знаете, что это такое.

Основное различие между ними состоит в том, что память, выделенная с помощью malloc(), существует до тех пор, пока вы не скажете об этом. Статическая память, такая как char buff[10];, существует только в области функций.

Ответ 4

malloc - это динамический распределитель памяти, который помогает присваивать памяти переменным ur в соответствии с потребностью ur и, следовательно, уменьшает потерю памяти. Он также поддерживается функцией realloc(), благодаря которой u может редактировать требуемую память, которая u определены ранее через malloc() или calloc(). Короче говоря, мы можем сказать, что malloc() может использоваться для управления пространством памяти и использования необходимой памяти, не теряя ее.

Ответ 5

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

structure A = { /* initialize correctly */ };

Нет смысла или смысла делать это как (в принципе) нетипизированный массив char. Если вам также нужен адрес этого зверя, воспользуйтесь адресом &A.

Ответ 6

Когда вы не знаете, сколько памяти выделяется во время компиляции. Возьмите очень простую программу, в которой вам нужно сохранить числа, введенные пользователем в связанном списке. Здесь вы не знаете, сколько номеров будет введено пользователем. Так как пользователь вводит номер, вы создадите node для него с помощью malloc и сохраните его в связанном списке.

Ответ 7

Если вы используете char[sizeof(structure)] вместо malloc, то я думаю, что никакого распределения динамической памяти не будет.

Ответ 8

Помимо того факта, что ваш метод char[] не может изменять размер или определять размер во время выполнения, ваш массив может быть неправильно выровнен для типа структуры, для которой вы хотите его использовать. Это может привести к поведению undefined.