Как изменить значения структуры, переданные функции

#c #function #struct

#c

Вопрос:

Привет, друзья, я практикую структуры. У меня есть эти две функции, одна из которых возвращает структуру, и я копирую ее в локальную структуру в main. Моя вторая функция изменяет эти локальные элементы структуры, вводя разные объекты. Теперь я напечатал результат после вызова каждой функции, к моему удивлению, я заметил, что напечатанный результат после того, как обе функции одинаковы. Я не могу понять, что здесь происходит … не могли бы вы, ребята, объяснить мне … спасибо!

  #include <stdio.h>
 #include <stdlib.h>

 struct student{
        char name[30];
        float marks;
        };


 struct student read_student();
 void read_student_p(struct student student3);
 void print_student(struct student student2);

 int main()
 {
     struct student student1;
     student1 = read_student();
     print_student(student1);
     read_student_p(student1);
     print_student(student1);
     system("pause");
     return 0;
 }

 //This is my first function
 struct student read_student()
 {
      struct student student2;
      printf("enter student name for first function: n");
      scanf("%s",amp;student2.name);

      printf("enter student marks for first function:n");
      scanf("%f",amp;student2.marks);

      return student2;
 }

//function to print 
void print_student(struct student my_student)
{
    printf("Student name in first function is : %sn",my_student.name);
    printf("Student marks in first function are: %fn",my_student.marks);
};

 //My second function  
 void read_student_p(struct student student3)
 {    
      printf("enter student name for second function: n");
      scanf("%s",amp;student3.name);
      printf("enter student marks for second function: n");
      scanf("%f",amp;student3.marks);
 }
 

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

1. Что происходит, и что вы ожидаете, что произойдет?

2. Он печатает то же имя и помечает даже после вызова второй функции… вы можете видеть, что во второй функции мы снова вводим новое имя и новые метки …. я ожидаю, что он напечатает это

Ответ №1:

Вы имеете в виду написать

 void read_student_p(struct student* student3)
                                  ^
{    


read_student_p(amp;student1);
               ^
 

Вам нужно передать указатель на read_student_p , если вы хотите изменить struct то, что вы передаете. В настоящее время она передается по значению, и изменения теряются.

Учитывая _p суффикс, я ожидаю, что это было задумано..

Ответ №2:

Когда вы делаете это:

read_student_p(student1);

И метод выглядит следующим образом:

 void read_student_p(struct student student3)
{    

  printf("enter student name for second function: n");
  scanf("%s",amp;student3.name);
  printf("enter student marks for second function: n");
  scanf("%f",amp;student3.marks);

 }
 

Структуры в C передаются по значению, а не по ссылке.

Итак, что делает read_student_p, так это берет копию структуры, которую вы передаете (student1), редактирует копию, а затем ничего не делает.

Одним из решений было бы вернуть измененную версию структуры. Другой версией было бы передать указатель на структуру и отредактировать структуру с помощью указателя (чтобы вы редактировали ту же копию структуры напрямую).

Ответ №3:

Во второй функции read_student_p , которую вы вызывали по значению, то есть вы определили новую структурную переменную tmp в функции и скопировали значение student1 в это значение tmp. Все изменения, которые вы сделали, касались значения tmp, которое не повлияло student1 бы.