k155la3 26 9 июня, 2017 Опубликовано 9 июня, 2017 · Жалоба Не стоит рассчитывать на сохранность локальных переменных вне функции. Поступаю следующим образом, определяю область памяти с помощью malloc() и передаю указатель в функцию, которая в свою очередь тоже может передать и возвратить его, после возврата указателя освобождаю область с помощью free(). Вместо динамически - локальной, для этой цели можно использовать static, и спокойно возвращать указатель. Если, конечно, позволяет объем памяти. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
novikovfb 17 9 июня, 2017 Опубликовано 9 июня, 2017 · Жалоба Вместо динамически - локальной, для этой цели можно использовать static, и спокойно возвращать указатель. Если, конечно, позволяет объем памяти. если нет требований по реентерабельности Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
sigmaN 0 9 июня, 2017 Опубликовано 9 июня, 2017 · Жалоба В функции winAPI совершенно не обязательно передавать указатель полученный через malloc(); Туда спокойно можено передать указатель на локальную переменную ВЫЗЫВАЮЩЕЙ функции. malloc() потребуется только если winAPI вызов асинхронный и возврат произойдет немедленно. После чего произойдет возврат из вызывающей функции и тогда снова висящий поинтер. Но такие ситуация не так часто встречается. И глупо в таких случаях использовать менеджер памяти. Как минимум это медленно! При чем тут С11/C99???? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
one_eight_seven 3 9 июня, 2017 Опубликовано 9 июня, 2017 · Жалоба При чем тут С11/C99???? Во-первых, они позволяют создавать массивы, длина которых вычисляется во время выполнения программы, а не во время компиляции. И во-вторых: если нет требований по реентерабельности в С11 есть _Thread_local Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
sigmaN 0 9 июня, 2017 Опубликовано 9 июня, 2017 · Жалоба Во-первых, они позволяют создавать массивы, длина которых вычисляется во время выполнения программы, а не во время компиляции. Классно! К топику это как-то относится? )))) Если всё равно этот массив будет на стеке! в С11 есть _Thread_localНе надо путать теплое с мягким. Т.е. реентерабельность с потокобезопасностью(thread safe) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
one_eight_seven 3 9 июня, 2017 Опубликовано 9 июня, 2017 · Жалоба К топику это как-то относится? )))) Если всё равно этот массив будет на стеке! К вопросу в топике относится. И в чём проблема что на стеке? Вы используете только кучу и регистры, без стека работаете и настаиваете на этом? Или в честь чего смайловая истерика? Не надо путать теплое с мягким. Т.е. реентерабельность с потокобезопасностью(thread safe) Реентрабельный - не всегда потокобезопасный, но потокобезопасный всегда реентрабельный, поскольку не только позволяет вызывать одну и ту же функцию из нескольких потоков, но ещё и сериализирует доступ к общим данным. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 184 12 июня, 2017 Опубликовано 12 июня, 2017 · Жалоба Реентрабельный - не всегда потокобезопасный, но потокобезопасный всегда реентрабельный, поскольку не только позволяет вызывать одну и ту же функцию из нескольких потоков, но ещё и сериализирует доступ к общим данным. И каким-же образом потокобезопасность поможет ТСу вернуть данные в вызывающую функцию из вызываемой в автоматической памяти не превратив их в мусор? :laughing: Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
sigmaN 0 12 июня, 2017 Опубликовано 12 июня, 2017 · Жалоба И в чём проблема что на стеке? Вы используете только кучу и регистры, без стека работаете и настаиваете на этом? Или в честь чего смайловая истерика?Обратите внимание на вопрос ТСа. Он именно возвращает указатель на локальную переменную которая на стеке. Я и обратил Ваше внимание на то, что прекрасная новая фича с размером массива, который может зависеть от параметра функции, к сути топика не имеет особого отношения... По поводу _Thread_local: Эта магия сработает в случае, когда выполнение функции прервано прерыванием и из этого прерывания вызвана та-же функция. C11 разберется, что это уже новый thread и нужно использовать другую копию этой переменной? )) Я не проверял, но сомневаюсь. Хотя опять же это уводит нас немного в сторону от вопроса ТС..... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
novikovfb 17 12 июня, 2017 Опубликовано 12 июня, 2017 · Жалоба И каким-же образом потокобезопасность поможет ТСу вернуть данные в вызывающую функцию из вызываемой в автоматической памяти не превратив их в мусор? :laughing: Никаким. Но использование статического или глобального буфера для возврата данных гарантирует проблемы в многопоточной среде (в том числе вызове функции из прерываний и основного процесса). Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться