Возвращение структуры в функции переменного тока - PullRequest
2 голосов
/ 29 июля 2011

У меня есть что-то вроде следующего C-кода:

struct MyStruct MyFunction (something here)
{
    struct MyStruct data;

    //Some code here

    return data;
}

Будет ли возвращаемое значение ссылкой или копией блока памяти для данных?Должна ли MyFunction возвращать struct MyStruct * (с соответствующим распределением памяти) вместо struct MyStruct?

Ответы [ 4 ]

6 голосов
/ 29 июля 2011

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

Вы не можете вернуть адрес локальной переменной, так как он выходит из области видимости, когда функция возвращается.Вы можете вернуть адрес чего-то, что вы только что malloc -ed, но вам нужно дать понять, что кому-то понадобится free этот указатель в какой-то момент.

4 голосов
/ 29 июля 2011

Будет возвращена копия. C является языком передачи по значению. Если вы не укажете, что передаете указатели, структуры копируются для присваиваний, операторов возврата и при использовании в качестве параметров функции.

1 голос
/ 29 июля 2011

Возвращается как копия. Кстати, вы не должны возвращать его ссылку, потому что он имеет автоматическую продолжительность хранения (т. Е. Данные находятся в стеке).

0 голосов
/ 29 июля 2011

У меня были проблемы с этим (функция в DLL, возвращающая структуру), и я исследовал ее.Возвращение структуры из DLL для использования людьми, у которых может быть другой компилятор, не является хорошей практикой из-за следующего.

Как это работает, зависит от реализации.Некоторые реализации возвращают небольшие записи в регистрах, но большинство получают невидимый дополнительный аргумент, который указывает на структуру результата в локальной структуре вызывающей стороны.По возвращении указатель используется для копирования данных в структуру в локальном кадре вызывающей стороны.Способ передачи этого указателя снова зависит от реализации: как последний аргумент, как первый аргумент или как регистр.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...