Когда 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.