| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > C/C++: Для новичков > нубский вопрос: зачем нужен malloc ? |
| Автор: koss 28.10.2013, 18:18 |
| Нахожусь в самом начале изучения языка Си и вопрос звучит так: если при объявлении структурной переменной компилятор автоматически выделяет память под все её элементы, то зачем тогда нужна функция malloc ? |
| Автор: Чупакабро 28.10.2013, 18:47 | ||
Для того, чтобы создавать и удалять переменные во время выполнения программы, по мере необходимости. Например, до запуска программы может быть неизвестно, сколько будет создано определенных переменных (например, это определяется пользовательским вводом). |
| Автор: 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 | ||||
Для "создания" и "удаления" переменных во время выполнения программы можно пользоваться обычной областью видимости и не за чем при этом malloc.
malloc используется для динамического выделения памяти, то есть, когда, например, размер выделяемой памяти не известен на этапе компиляции или когда нужно использовать одну и ту же память в разных модулях и т.д. |
| Автор: vinter 29.10.2013, 13:45 | ||
Справедливости ради: C давно поддерживает массивы на стеке с размерностью, которая не является константным выражением. C++, с 14 года, тоже будет это уметь. Поэтому, в данном случае, malloc не то чтобы необходим. |
| Автор: Фантом 29.10.2013, 15:56 | ||
На стеке. А в современной реальности обычно имеется две крайности: 1) массив в любом случае маленький, поэтому можно сразу завести заведомо больший массив константного размера; 2) массив большой и в стек просто не лезет. Вот для второго случая malloc (а лучше calloc) и нужен. |