Перейти к содержанию
    

возврат указателя на массив из ф-ии

Не стоит рассчитывать на сохранность локальных переменных вне функции. Поступаю следующим образом, определяю область памяти с помощью malloc() и передаю указатель в функцию, которая в свою очередь тоже может передать и возвратить его, после возврата указателя освобождаю область с помощью free().

 

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

Если, конечно, позволяет объем памяти.

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Если, конечно, позволяет объем памяти.

если нет требований по реентерабельности

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В функции winAPI совершенно не обязательно передавать указатель полученный через malloc();

Туда спокойно можено передать указатель на локальную переменную ВЫЗЫВАЮЩЕЙ функции.

malloc() потребуется только если winAPI вызов асинхронный и возврат произойдет немедленно. После чего произойдет возврат из вызывающей функции и тогда снова висящий поинтер.

Но такие ситуация не так часто встречается. И глупо в таких случаях использовать менеджер памяти. Как минимум это медленно!

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

И во-вторых:

если нет требований по реентерабельности

в С11 есть _Thread_local

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Классно!

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

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

 

 

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

Реентрабельный - не всегда потокобезопасный, но потокобезопасный всегда реентрабельный, поскольку не только позволяет вызывать одну и ту же функцию из нескольких потоков, но ещё и сериализирует доступ к общим данным.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Реентрабельный - не всегда потокобезопасный, но потокобезопасный всегда реентрабельный, поскольку не только позволяет вызывать одну и ту же функцию из нескольких потоков, но ещё и сериализирует доступ к общим данным.

И каким-же образом потокобезопасность поможет ТСу вернуть данные в вызывающую функцию из вызываемой в автоматической памяти не превратив их в мусор? :laughing:

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Я и обратил Ваше внимание на то, что прекрасная новая фича с размером массива, который может зависеть от параметра функции, к сути топика не имеет особого отношения...

 

По поводу _Thread_local:

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

Я не проверял, но сомневаюсь.

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

И каким-же образом потокобезопасность поможет ТСу вернуть данные в вызывающую функцию из вызываемой в автоматической памяти не превратив их в мусор? :laughing:

Никаким. Но использование статического или глобального буфера для возврата данных гарантирует проблемы в многопоточной среде (в том числе вызове функции из прерываний и основного процесса).

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...