возврат структур в си

программирование техника си структуры

как функции в си возвращают структуры?

нужно понять, что расположено на регистрах, что в памяти и где/

Примечание:
возвращаемая структура где расположена? в чьем стеке?

как работают в случае "не обычно" ?

Примечание:
в стеке вызывающей или вызываемой или где?

я о возврате структур из функций.
как передают их в функцию мне пока что не интересно.

Примечание:
Видимость нельзя переделывать. там рекурсивные вызовы с обработкой возвращенных структур (дерево). При этом вызовы нужны.
(переписывать прогу нельзя)

Примечание:
alexander.p - можно вас попросить создавать новые ответы, а не дополнять основной?
где в кенригане (или в стандарте си) описан возврат функцией структуры?

Примечание:
http://lib.ru/CTOTOR/kernigan.txt = про возврат структур (или сруктур, как там пишут) из функций ничего не нашел.

Примечание:
zer0 - у вас неправильный код, тип возвращаемого значения не тот

я про код
struct aaa f(){
struct aaa b;
return b;
}
Ответы:
Передают и возвращают указатели на структуры, обычно.
Параметры вызовов функций в Си размещаются на стеке.
Делаешь видимость имён побольше и обрабатываешь свою структуру спокойненько из разных функций.
Единственно верный способ узнать, как возвращаются структуры в в твоем случае - это сгенерировать ассемблер (с теми же ключами, что и Release вариант компиляции) и посмотреть туда. Как генерировать ассемблер - изучай параметры командной строки твоего компилятора.
Структуру из функции можно вернуть, только если память под нее выделялась динамически, т. е. через malloc() в случае C. Пример:
(to zer0) Неверно! Язык С допускает присваивание объектов структурного типа. Вероятно, вы имели ввиду, что возвращать адрес локального объекта - мало осмысленное действие. Это да.
если это еще актуально:
* Return Value
* Integers (of any size up to 32 bits) and pointers are returned in the %eax register.
* Floating point values are returned in the 387 top-of-stack register, st(0).
* Return values of type long long int are returned in %edx:%eax (the most significant word in %edx and the least significant in %eax).
* Returning a structure is complicated and rarely useful; try to avoid it. (Note that this is different from returning a pointer to a structure.)
т.е. если возвращается указатель на структуру, он будет класться в регистр %eax. насчет возврата собственно структуры - не знаю.


15 лет назад

RPI.su - самая большая русскоязычная база вопросов и ответов. Наш проект был реализован как продолжение популярного сервиса otvety.google.ru, который был закрыт и удален 30 апреля 2015 года. Мы решили воскресить полезный сервис Ответы Гугл, чтобы любой человек смог публично узнать ответ на свой вопрос у интернет сообщества.

Все вопросы, добавленные на сайт ответов Google, мы скопировали и сохранили здесь. Имена старых пользователей также отображены в том виде, в котором они существовали ранее. Только нужно заново пройти регистрацию, чтобы иметь возможность задавать вопросы, или отвечать другим.

Чтобы связаться с нами по любому вопросу О САЙТЕ (реклама, сотрудничество, отзыв о сервисе), пишите на почту [email protected]. Только все общие вопросы размещайте на сайте, на них ответ по почте не предоставляется.