![]() |
Модераторы: bsa |
![]() ![]() ![]() |
|
koss |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 36 Регистрация: 18.10.2005 Где: Москва Репутация: нет Всего: нет |
Нахожусь в самом начале изучения языка Си и вопрос звучит так:
если при объявлении структурной переменной компилятор автоматически выделяет память под все её элементы, то зачем тогда нужна функция malloc ? |
|||
|
||||
Фантом |
|
|||
![]() Вы это прекратите! ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1516 Регистрация: 23.3.2008 Репутация: 4 Всего: 49 |
Попробуйте: 1) без использования C99 объявить массив целых чисел, размеры которого перед объявлением вводятся с консоли; 2) в рамках любого стандарта объявить массив вроде double A[5000][5000] и что-нибудь с ним сделать. |
|||
|
||||
Чупакабро |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 220 Регистрация: 27.2.2007 Репутация: нет Всего: 4 |
Для того, чтобы создавать и удалять переменные во время выполнения программы, по мере необходимости. Например, до запуска программы может быть неизвестно, сколько будет создано определенных переменных (например, это определяется пользовательским вводом). --------------------
Project Project1.exe raised exception class EAccessViolation with message 'Access violation at address 00459B8B in module 'Project1.exe'. Read of address 0000019C'. Process stopped. Use Step or Run to continue. |
|||
|
||||
vinter |
|
|||
![]() Explorer ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2735 Регистрация: 1.4.2006 Где: Н.Новгород Репутация: 8 Всего: 56 |
Потому что задействованы разные типы памяти: для простого определения это стэк, тогда как malloc выделяет память в куче. Стэк, как правило, небольшого размера(1Мб, например), в то время как куча это почти всё адресное пространство выделенное процессу.
Помимо "тучи места в куче", есть еще и такая вещь как локальность данных. Так вот, стек это память "процедурная", т.е. она локальна процедуре и не может использоваться вне её. Тогда как куча локальна процессу и может быть доступна из любой его точки. Это сообщение отредактировал(а) vinter - 28.10.2013, 19:05 |
|||
|
||||
koss |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 36 Регистрация: 18.10.2005 Где: Москва Репутация: нет Всего: нет |
спасибо!
|
|||
|
||||
EgoBrain |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 537 Регистрация: 23.3.2008 Где: Комната Репутация: нет Всего: 2 |
vinter, а как же статические и глобальные пременные, которые доступны в любом месте программы, они тоже в куче создаются, хотя в коде не фигурируют функции выделения памяти в куче?
|
|||
|
||||
vinter |
|
|||
![]() Explorer ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2735 Регистрация: 1.4.2006 Где: Н.Новгород Репутация: 8 Всего: 56 |
нет, они не в куче. Они в своём типе памяти, который отличен от стека и кучи. Часть из них в read-only памяти, часть нет. Всё зависит от того чем они являются и как были инициализированы.
|
|||
|
||||
Acer |
|
||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 652 Регистрация: 5.9.2007 Где: UA::DN Репутация: нет Всего: 8 |
Для "создания" и "удаления" переменных во время выполнения программы можно пользоваться обычной областью видимости и не за чем при этом malloc.
malloc используется для динамического выделения памяти, то есть, когда, например, размер выделяемой памяти не известен на этапе компиляции или когда нужно использовать одну и ту же память в разных модулях и т.д. |
||||
|
|||||
vinter |
|
|||
![]() Explorer ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2735 Регистрация: 1.4.2006 Где: Н.Новгород Репутация: 8 Всего: 56 |
Справедливости ради: C давно поддерживает массивы на стеке с размерностью, которая не является константным выражением. C++, с 14 года, тоже будет это уметь. Поэтому, в данном случае, malloc не то чтобы необходим. Это сообщение отредактировал(а) vinter - 29.10.2013, 13:45 |
|||
|
||||
Фантом |
|
|||
![]() Вы это прекратите! ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1516 Регистрация: 23.3.2008 Репутация: 4 Всего: 49 |
На стеке. А в современной реальности обычно имеется две крайности: 1) массив в любом случае маленький, поэтому можно сразу завести заведомо больший массив константного размера; 2) массив большой и в стек просто не лезет. Вот для второго случая malloc (а лучше calloc) и нужен. |
|||
|
||||
![]() ![]() ![]() |
Правила форума "C/C++: Для новичков" | |
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Для новичков | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |