Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Для новичков > нубский вопрос: зачем нужен malloc ?


Автор: koss 28.10.2013, 18:18
Нахожусь в самом начале изучения языка Си и вопрос звучит так:

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

Автор: Фантом 28.10.2013, 18:45
Цитата(koss @  28.10.2013,  19:18 Найти цитируемый пост)
если при объявлении структурной переменной компилятор автоматически выделяет память под все её элементы, то зачем тогда нужна функция malloc ? 


Попробуйте:
1) без использования C99 объявить массив целых чисел, размеры которого перед объявлением вводятся с консоли;
2) в рамках любого стандарта объявить массив вроде double A[5000][5000] и что-нибудь с ним сделать.

Автор: Чупакабро 28.10.2013, 18:47
Цитата(koss @  28.10.2013,  18:18 Найти цитируемый пост)
если при объявлении структурной переменной компилятор автоматически выделяет память под все её элементы, то зачем тогда нужна функция malloc 

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

Автор: vinter 28.10.2013, 19:03
Потому что задействованы разные типы памяти: для простого определения это стэк, тогда как malloc выделяет память в куче. Стэк, как правило, небольшого размера(1Мб, например), в то время как куча это почти всё адресное пространство выделенное процессу. 
Помимо "тучи места в куче", есть еще и такая вещь как локальность данных. Так вот, стек это память "процедурная", т.е. она локальна процедуре и не может использоваться вне её. Тогда как куча локальна процессу и может быть доступна из любой его точки. 

Автор: koss 28.10.2013, 19:42
спасибо!

Автор: EgoBrain 29.10.2013, 01:26
vinter, а как же статические и глобальные пременные, которые доступны в любом месте программы, они тоже в куче создаются, хотя в коде не фигурируют функции выделения памяти в куче?

Автор: vinter 29.10.2013, 07:44
нет, они не в куче. Они в своём типе памяти, который отличен от стека и кучи. Часть из них в read-only памяти, часть нет. Всё зависит от того чем они являются и как были инициализированы. 

Автор: Acer 29.10.2013, 13:41
Цитата(Чупакабро @ 28.10.2013,  18:47)
Для того, чтобы создавать и удалять переменные во время выполнения программы, по мере необходимости.
Например, до запуска программы может быть неизвестно, сколько будет создано определенных переменных (например, это определяется пользовательским вводом).

Для "создания" и "удаления" переменных во время выполнения программы можно пользоваться обычной областью видимости и не за чем при этом malloc.
Код

{
  int a = 10;//выделение памяти на стеке
  a++;
}//удаление памяти со стека

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

Автор: vinter 29.10.2013, 13:45
Цитата

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

Справедливости ради: C давно поддерживает массивы на стеке с размерностью, которая не является константным выражением. C++, с 14 года, тоже будет это уметь. Поэтому, в данном случае, malloc не то чтобы необходим.

Автор: Фантом 29.10.2013, 15:56
Цитата(vinter @  29.10.2013,  14:45 Найти цитируемый пост)

Справедливости ради: C давно поддерживает массивы на стеке с размерностью, которая не является константным выражением.

На стеке. А в современной реальности обычно имеется две крайности:
1) массив в любом случае маленький, поэтому можно сразу завести заведомо больший массив константного размера;
2) массив большой и в стек просто не лезет.

Вот для второго случая malloc (а лучше calloc) и нужен.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)