Отправка структур функциям на C

#c #function #struct

#c #функция #структура

Вопрос:

У меня есть пример фрагмента кода, и у меня возник вопрос по этому поводу. Вот код. Мои вопросы относятся к комментариям в нижней части кода, и мне было интересно, может ли кто-нибудь помочь. Здесь возникает путаница.

 #include <stdio.h>
#include <string.h>

struct car {
    char make[30];
    char model[30];
    int year;
};

struct car f(struct car c);

int main(void)
{
    struct car c1 = {"Ford", "Mustang", 2014}, c2;
    c2 = c1;

    printf("%s, %s, %dn", c1.make, c1.model, c1.year);
    c2 = f(c1);
    printf("%s, %s, %dn", c2.make, c2.model, c2.year);
}

struct car f(struct car c) /* Is car here referring to the structure at the very top
                             of the program, so it knows what structure to put it? */
{
    struct car temp = c;  /* What exactly is c in this function and why copy it? */
    strcpy(temp.model, "Explorer");
    temp.year  = 5;

    return temp;
}
  

Код печатает:

 Ford, Mustang, 2014
Ford, Explorer, 2019
  

Комментарии:

1. struct car c in f() является копией c1 из main() . c1 не изменяется f(c1) .

2. Спасибо. значит, c в функции f является c1 в виде строки? могу ли я просто распечатать это с помощью printf(«%s», c)??

3. Нет. c является копией структуры. c это структура, а не строка.

4. struct car temp = c; бессмысленно, вы могли бы просто поработать над c в функции и вернуть c

5. передача структуры по значению — очень плохая идея, поскольку это приводит к постоянному выделению части оперативной памяти, достаточно большой, чтобы вместить структуру, и копированию структуры в нее. Гораздо лучше передать ptr в структуру, которая будет передана в стек

Ответ №1:

struct car это тип, который определен в верхней части вашей программы. Итак, struct car f(struct car c) это функция с именем f , которая принимает struct car named c в качестве параметра и возвращает другое struct car .

Причина создания копии c заключается в том, что вы можете изменить одну из них, не затрагивая другую. Поскольку в данном случае вы передавали c по значению, это не имеет особого значения; вы могли бы отредактировать c , а затем вернуть его. Но если бы вы передали его по ссылке (т. Е. передали указатель на него), то его изменение изменило бы копию вызывающего объекта, что может быть не тем, что вы хотите.

Ответ №2:

При вызове f() структура копируется, а затем передается в функцию. Любые изменения, внесенные в функцию, будут отброшены при выходе. Однако вы передаете структуру, которую затем сохраняете и печатаете. Итак, чтобы ответить на ваш вопрос, struct car в функции является временной переменной, которая напрямую не ссылается ни на что внешнее по отношению к функции.

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

Ответ №3:

 struct car f(struct car c) /*is car here refering to the structure at the very top
                            of the program, so it knows what structure to put it?/*
  

struct car вот type 'struct car' defining X . struct car Вверху определяет глобальный тип struct car . X ссылается на функцию f , которая обеспечивает возврат типа struct car и c аргумент, который ожидает ссылку на тип struct car (независимо от того, какое имя у нее есть). Структура car вверху имеет глобальную область видимости, функция выше ожидает, что такой инструмент, как c1 или c2 , объявленный в main().