Как функция возвращает значение функции для меня, просто для запуска:
int f()
{
int a = 2;
return a;
}
Теперь a
получает память в стеке, а его жизненный цикл находится в пределах f()
, чтобы вернуть значение, которое оно копирует, в специальный регистр, который считывается вызывающим, поскольку он знает, что вызываемый поставил для него значение.
(Поскольку размер специального регистра размера обладателя возвращаемого значения ограничен, поэтому мы не можем возвращать большие объекты, поэтому в случае передовых языков, когда мы хотим вернуть функцию объекта, фактически копирует адрес объекта в кучу в этот специальный регистр)
Давайте вернемся к C для ситуации, когда я хочу вернуть переменную struct not pointer:
struct inventory
{
char name[20];
int number;
};
struct inventory function();
int main()
{
struct inventory items;
items=function();
printf("\nam in main\n");
printf("\n%s\t",items.name);
printf(" %d\t",items.number);
getch();
return 0;
}
struct inventory function()
{
struct inventory items;
printf(" enter the item name\n ");
scanf(" %s ",&items.name );
printf(" enter the number of items\n ");
scanf("%d",&items.number );
return items;
}
Код forked from: qaru.site/info/160866/...
Вот сделка,
Давайте начнем с основной, items
переменной объявленной, но не инициализированной, а затем вызывается функция, которая возвращает инициализированную структурную переменную, которая копируется в основную.
Теперь я немного размыт, чтобы понять, как function()
возвращает структурную переменную items
, которая не создается динамически (технически не в куче), поэтому этот жизненный цикл переменной находится внутри тела function()
, а размер переменной item
может быть достаточно огромным, чтобы не вписываться в специальный регистр, так почему это сработало? (Я знаю, что мы можем динамически распределять функцию внутри и возвращать адрес, но я не хочу альтернативы, я ищу объяснение)
Вопрос:
Хотя он работает, но как function()
фактически вернул переменную struct и скопировал в items
переменную в main когда он должен умереть с возвратом function()
.
Я, конечно, пропустил важную вещь, подробное объяснение поможет.:)
EDIT: Другие ответы на отзывы: