реклама на сайте
подробности

 
 
> Возвращение указателя на динамический массив
Nikitoc
сообщение Mar 1 2012, 15:03
Сообщение #1


Местный
***

Группа: Validating
Сообщений: 207
Регистрация: 14-01-09
Из: Днепропетровск
Пользователь №: 43 367



Всем привет!
Вопросик простой, но для полноты картины происходящего в компиляторе (или в МК) мне нужно этот вопрос разъяснить. Допустим, есть какая-то функция:
Код
WORD *Multiple (BYTE A, BYTE B){
           WORD *result;
           result = (WORD *)malloc(1);
           *result = A * B;
           return result;
       }


Собственно вопросы:

1. Где необходимо удалять эту переменную result (я имею в виду вызов ф-ции free())? Только в той функции, в которой она была выделена (Multiple()) или же можно сделать это в вызывающей функции по полученному указателю?
2. Я правильно понимаю, что возвращать указатель можно потому, что динамически выделенная переменная помещается в кучу, а не в стек?
3. Как называется область оперативной памяти, которая не отводится под кучу или стек? Как она используется компилятором (что туда "ложится")?
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Сергей Борщ
сообщение Mar 1 2012, 18:18
Сообщение #2


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



QUOTE (Nikitoc @ Mar 1 2012, 17:03) *
1. Где необходимо удалять эту переменную result (я имею в виду вызов ф-ции free())? Только в той функции, в которой она была выделена (Multiple()) или же можно сделать это в вызывающей функции по полученному указателю?
В том месте, где вам больше не нужна та память, на которую указывает указатель. Совершенно не обязательно в этой функции. Вся информация, необходимая для освобождения памяти хранится в скрытом виде внутри выделенного malloc() блока и для доступа к ней достаточно лишь указателя, который вернул malloc().
По второму вопросу: совершенно верно.
QUOTE (Nikitoc @ Mar 1 2012, 17:03) *
3. Как называется область оперативной памяти, которая не отводится под кучу или стек? Как она используется компилятором (что туда "ложится")?
Никак не используется. Поэтому либо под стек выделяют всю оставшуюся после резервирования кучи память либо наоборот - под кучу всю оставшуюся после резервирования стека.

QUOTE (xemul @ Mar 1 2012, 18:20) *
Возвращается адрес блока, выделенного malloc(). Если у ТС есть охота на траблы, почему бы и нет?
Какие траблы вы имеете ввиду? И как вы себе представляете другое использование кучи?

QUOTE (toweroff @ Mar 1 2012, 18:40) *
да не суть laughing.gif
Именно что суть. Да вы не стесняйтесь, расскажите нам в чем тут ойой. Посмеемся вместе. Над вами.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
xemul
сообщение Mar 1 2012, 18:54
Сообщение #3



*****

Группа: Свой
Сообщений: 1 928
Регистрация: 11-07-06
Пользователь №: 18 731



Цитата(Сергей Борщ @ Mar 1 2012, 22:18) *
Какие траблы вы имеете ввиду? И как вы себе представляете другое использование кучи?

Я не про использование кучи - оно вполне естественно, - а про несвязанные явно выделение и освобождение памяти.
Мне больше по душе, когда "выделил - ... - освободил" очевидно (свернув промежуточные {} при необходимости). Мне и своего склероза памяти хватает sm.gif
Go to the top of the page
 
+Quote Post
_Pasha
сообщение Mar 2 2012, 01:34
Сообщение #4


;
******

Группа: Участник
Сообщений: 5 646
Регистрация: 1-08-07
Пользователь №: 29 509



Цитата(xemul @ Mar 1 2012, 21:54) *
Я не про использование кучи - оно вполне естественно, - а про несвязанные явно выделение и освобождение памяти.
Мне больше по душе, когда "выделил - ... - освободил" очевидно (свернув промежуточные {} при необходимости). Мне и своего склероза памяти хватает sm.gif

Тогда alloca() вместо . sm.gif
Посерьезней:
чтобы не было фрагментации, надо писать свой обработчик, заточенный под работу с массивом указателей. Тогда доступ к объекту не напрямую, а через дескриптор - номер элемента массива. Номера у нас остаются неизменными, а указатели могут свободно измениться если автор затеет дефрагментацию средствами своего манагера склероза.
Естественно, это все возможно, если отбросить иллюзию того, что "кол-во выделяемых блоков может быть любым." sm.gif

Сообщение отредактировал _Pasha - Mar 2 2012, 01:35
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- Nikitoc   Возвращение указателя на динамический массив   Mar 1 2012, 15:03
- - ys05   Цитата(Nikitoc @ Mar 1 2012, 18:03) 1. Гд...   Mar 1 2012, 15:59
- - toweroff   ойой возвращать из функции адрес локальной перемен...   Mar 1 2012, 16:09
|- - xemul   Цитата(toweroff @ Mar 1 2012, 20:09) ойой...   Mar 1 2012, 16:20
|- - toweroff   Цитата(xemul @ Mar 1 2012, 20:20) Возвращ...   Mar 1 2012, 16:40
|- - toweroff   Цитата(Сергей Борщ @ Mar 1 2012, 22:18) И...   Mar 1 2012, 18:28
- - Nikitoc   Всем спасибо за ответы. Вопрос Сергею: я спросил п...   Mar 1 2012, 18:54
- - _Ivana   Это стОит того, чтобы ждать! Так и я пойму да...   Mar 1 2012, 19:39
- - Сергей Борщ   QUOTE (toweroff @ Mar 1 2012, 20:28) то е...   Mar 1 2012, 19:44
- - toweroff   Цитата(Сергей Борщ @ Mar 1 2012, 23:44) В...   Mar 1 2012, 19:51
|- - Сергей Борщ   QUOTE (toweroff @ Mar 1 2012, 21:51) полу...   Mar 1 2012, 20:10
- - Nikitoc   Сергей, спасибо Вам большое. Разжевано предельно п...   Mar 1 2012, 19:57
- - _Ivana   Со стеком имхо ничего не поможет справиться, кроме...   Mar 1 2012, 20:00
|- - toweroff   Цитата(_Ivana @ Mar 2 2012, 00:00) Со сте...   Mar 1 2012, 20:03
- - _Ivana   Как интересно-то! Лично я бы стал пользоватьс...   Mar 1 2012, 20:17
|- - XVR   Цитата(_Ivana @ Mar 2 2012, 00:17) Если ф...   Mar 2 2012, 08:40
- - toweroff   То есть "в лоб" - (как уже упомянали) - ...   Mar 1 2012, 20:24
- - _Ivana   Ладно, уговорили: free_всё_кроме_заполненного_масс...   Mar 1 2012, 20:30
|- - Сергей Борщ   QUOTE (_Ivana @ Mar 1 2012, 22:30) просто...   Mar 1 2012, 20:55
- - toweroff   Цитата(_Ivana @ Mar 2 2012, 00:30) Ладно,...   Mar 1 2012, 21:00
- - _Ivana   Это было на правах фантазии дилетанта Убирать в к...   Mar 1 2012, 21:07
- - _Ivana   XVR спасибо, очень интересно и познавательно!   Mar 2 2012, 15:00
- - Idle   Цитатаresult = (WORD *)malloc(1); вылезаешь за гра...   Mar 3 2012, 13:41


Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 19th July 2025 - 04:26
Рейтинг@Mail.ru


Страница сгенерированна за 0.0176 секунд с 7
ELECTRONIX ©2004-2016