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

 
 
2 страниц V  < 1 2  
Reply to this topicStart new topic
> возврат указателя на массив из ф-ии, немного теории
k155la3
сообщение Jun 9 2017, 08:18
Сообщение #16


Профессионал
*****

Группа: Свой
Сообщений: 1 123
Регистрация: 8-03-09
Из: Днепр
Пользователь №: 45 848



Цитата(AnatolyT @ Jun 8 2017, 22:56) *
Не стоит рассчитывать на сохранность локальных переменных вне функции. Поступаю следующим образом, определяю область памяти с помощью malloc() и передаю указатель в функцию, которая в свою очередь тоже может передать и возвратить его, после возврата указателя освобождаю область с помощью free().


Вместо динамически - локальной, для этой цели можно использовать static, и спокойно возвращать указатель.
Если, конечно, позволяет объем памяти.

Go to the top of the page
 
+Quote Post
novikovfb
сообщение Jun 9 2017, 08:41
Сообщение #17


Знающий
****

Группа: Участник
Сообщений: 518
Регистрация: 29-09-11
Пользователь №: 67 450



Цитата(k155la3 @ Jun 9 2017, 12:18) *
Вместо динамически - локальной, для этой цели можно использовать static, и спокойно возвращать указатель.
Если, конечно, позволяет объем памяти.

если нет требований по реентерабельности
Go to the top of the page
 
+Quote Post
sigmaN
сообщение Jun 9 2017, 09:11
Сообщение #18


I WANT TO BELIEVE
******

Группа: Свой
Сообщений: 2 617
Регистрация: 9-03-08
Пользователь №: 35 751



В функции winAPI совершенно не обязательно передавать указатель полученный через malloc();
Туда спокойно можено передать указатель на локальную переменную ВЫЗЫВАЮЩЕЙ функции.
malloc() потребуется только если winAPI вызов асинхронный и возврат произойдет немедленно. После чего произойдет возврат из вызывающей функции и тогда снова висящий поинтер.
Но такие ситуация не так часто встречается. И глупо в таких случаях использовать менеджер памяти. Как минимум это медленно!

При чем тут С11/C99????


--------------------
The truth is out there...
Go to the top of the page
 
+Quote Post
one_eight_seven
сообщение Jun 9 2017, 11:00
Сообщение #19


Знающий
****

Группа: Участник
Сообщений: 916
Регистрация: 3-10-08
Из: Москва
Пользователь №: 40 664



Цитата
При чем тут С11/C99????

Во-первых, они позволяют создавать массивы, длина которых вычисляется во время выполнения программы, а не во время компиляции.
И во-вторых:
Цитата
если нет требований по реентерабельности

в С11 есть _Thread_local
Go to the top of the page
 
+Quote Post
sigmaN
сообщение Jun 9 2017, 11:08
Сообщение #20


I WANT TO BELIEVE
******

Группа: Свой
Сообщений: 2 617
Регистрация: 9-03-08
Пользователь №: 35 751



Цитата
Во-первых, они позволяют создавать массивы, длина которых вычисляется во время выполнения программы, а не во время компиляции.

Классно!
К топику это как-то относится? )))) Если всё равно этот массив будет на стеке!

Цитата
в С11 есть _Thread_local
Не надо путать теплое с мягким. Т.е. реентерабельность с потокобезопасностью(thread safe)


--------------------
The truth is out there...
Go to the top of the page
 
+Quote Post
one_eight_seven
сообщение Jun 9 2017, 12:26
Сообщение #21


Знающий
****

Группа: Участник
Сообщений: 916
Регистрация: 3-10-08
Из: Москва
Пользователь №: 40 664



Цитата
К топику это как-то относится? )))) Если всё равно этот массив будет на стеке!

К вопросу в топике относится. И в чём проблема что на стеке? Вы используете только кучу и регистры, без стека работаете и настаиваете на этом? Или в честь чего смайловая истерика?


Цитата
Не надо путать теплое с мягким. Т.е. реентерабельность с потокобезопасностью(thread safe)

Реентрабельный - не всегда потокобезопасный, но потокобезопасный всегда реентрабельный, поскольку не только позволяет вызывать одну и ту же функцию из нескольких потоков, но ещё и сериализирует доступ к общим данным.
Go to the top of the page
 
+Quote Post
jcxz
сообщение Jun 12 2017, 07:01
Сообщение #22


Гуру
******

Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713



Цитата(one_eight_seven @ Jun 9 2017, 14:26) *
Реентрабельный - не всегда потокобезопасный, но потокобезопасный всегда реентрабельный, поскольку не только позволяет вызывать одну и ту же функцию из нескольких потоков, но ещё и сериализирует доступ к общим данным.

И каким-же образом потокобезопасность поможет ТСу вернуть данные в вызывающую функцию из вызываемой в автоматической памяти не превратив их в мусор? laughing.gif
Go to the top of the page
 
+Quote Post
sigmaN
сообщение Jun 12 2017, 09:18
Сообщение #23


I WANT TO BELIEVE
******

Группа: Свой
Сообщений: 2 617
Регистрация: 9-03-08
Пользователь №: 35 751



Цитата
И в чём проблема что на стеке? Вы используете только кучу и регистры, без стека работаете и настаиваете на этом? Или в честь чего смайловая истерика?
Обратите внимание на вопрос ТСа. Он именно возвращает указатель на локальную переменную которая на стеке.
Я и обратил Ваше внимание на то, что прекрасная новая фича с размером массива, который может зависеть от параметра функции, к сути топика не имеет особого отношения...

По поводу _Thread_local:
Эта магия сработает в случае, когда выполнение функции прервано прерыванием и из этого прерывания вызвана та-же функция. C11 разберется, что это уже новый thread и нужно использовать другую копию этой переменной? ))
Я не проверял, но сомневаюсь.

Хотя опять же это уводит нас немного в сторону от вопроса ТС.....


--------------------
The truth is out there...
Go to the top of the page
 
+Quote Post
novikovfb
сообщение Jun 12 2017, 15:22
Сообщение #24


Знающий
****

Группа: Участник
Сообщений: 518
Регистрация: 29-09-11
Пользователь №: 67 450



Цитата(jcxz @ Jun 12 2017, 11:01) *
И каким-же образом потокобезопасность поможет ТСу вернуть данные в вызывающую функцию из вызываемой в автоматической памяти не превратив их в мусор? laughing.gif

Никаким. Но использование статического или глобального буфера для возврата данных гарантирует проблемы в многопоточной среде (в том числе вызове функции из прерываний и основного процесса).
Go to the top of the page
 
+Quote Post

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

 


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


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