Когда нужен malloc в C? - PullRequest
       2

Когда нужен malloc в C?

12 голосов
/ 08 октября 2010

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

char[sizeof(structure)]

Тогда когда malloc необходимо?

Ответы [ 8 ]

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

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

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

<ч />

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

8 голосов
/ 08 октября 2010

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

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

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

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

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

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

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


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

  -Wall -ansi -pedantic -Wstrict-prototypes
4 голосов
/ 08 октября 2010

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

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

1 голос
/ 08 октября 2010

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

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

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

1 голос
/ 08 октября 2010

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

0 голосов
/ 09 октября 2010

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

0 голосов
/ 08 октября 2010

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

0 голосов
/ 08 октября 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...