Модераторы: bsa
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> нубский вопрос: зачем нужен malloc ? 
:(
    Опции темы
koss
Дата 28.10.2013, 18:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 36
Регистрация: 18.10.2005
Где: Москва

Репутация: нет
Всего: нет



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

если при объявлении структурной переменной компилятор автоматически выделяет память под все её элементы, то зачем тогда нужна функция malloc ?
PM MAIL   Вверх
Фантом
Дата 28.10.2013, 18:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Вы это прекратите!
***


Профиль
Группа: Участник Клуба
Сообщений: 1516
Регистрация: 23.3.2008

Репутация: 4
Всего: 49



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


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

PM   Вверх
Чупакабро
Дата 28.10.2013, 18:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 220
Регистрация: 27.2.2007

Репутация: нет
Всего: 4



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

Для того, чтобы создавать и удалять переменные во время выполнения программы, по мере необходимости.
Например, до запуска программы может быть неизвестно, сколько будет создано определенных переменных (например, это определяется пользовательским вводом).
--------------------
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.
PM MAIL   Вверх
vinter
Дата 28.10.2013, 19:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Explorer
****


Профиль
Группа: Завсегдатай
Сообщений: 2735
Регистрация: 1.4.2006
Где: Н.Новгород

Репутация: 8
Всего: 56



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


Это сообщение отредактировал(а) vinter - 28.10.2013, 19:05


--------------------
Мой блог
PM MAIL WWW   Вверх
koss
Дата 28.10.2013, 19:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 36
Регистрация: 18.10.2005
Где: Москва

Репутация: нет
Всего: нет



спасибо!
PM MAIL   Вверх
EgoBrain
Дата 29.10.2013, 01:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 537
Регистрация: 23.3.2008
Где: Комната

Репутация: нет
Всего: 2



vinter, а как же статические и глобальные пременные, которые доступны в любом месте программы, они тоже в куче создаются, хотя в коде не фигурируют функции выделения памяти в куче?
PM MAIL ICQ Skype   Вверх
vinter
Дата 29.10.2013, 07:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Explorer
****


Профиль
Группа: Завсегдатай
Сообщений: 2735
Регистрация: 1.4.2006
Где: Н.Новгород

Репутация: 8
Всего: 56



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


--------------------
Мой блог
PM MAIL WWW   Вверх
Acer
Дата 29.10.2013, 13:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 652
Регистрация: 5.9.2007
Где: UA::DN

Репутация: нет
Всего: 8



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

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

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

malloc используется для динамического выделения памяти, то есть, когда, например, размер выделяемой памяти не известен на этапе компиляции или когда нужно использовать одну и ту же память в разных модулях и т.д.
PM MAIL   Вверх
vinter
Дата 29.10.2013, 13:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Explorer
****


Профиль
Группа: Завсегдатай
Сообщений: 2735
Регистрация: 1.4.2006
Где: Н.Новгород

Репутация: 8
Всего: 56



Цитата

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

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

Это сообщение отредактировал(а) vinter - 29.10.2013, 13:45


--------------------
Мой блог
PM MAIL WWW   Вверх
Фантом
Дата 29.10.2013, 15:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Вы это прекратите!
***


Профиль
Группа: Участник Клуба
Сообщений: 1516
Регистрация: 23.3.2008

Репутация: 4
Всего: 49



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

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

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

Вот для второго случая malloc (а лучше calloc) и нужен.
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

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


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.2119 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.