3

こんにちは友達私は構造を練習しています。私はこれらの2つの関数を持っており、1つは構造体を返し、それをmainのローカル構造体にコピーします。2番目の関数は、さまざまなエンティティを入力して、これらのローカル構造体メンバーを変更します。これで、各関数を呼び出した後に結果を印刷しました。驚いたことに、両方の関数の後で印刷された結果が同じであることに気付きました。ここで何が起こっているのか理解できません…皆さん、説明してもらえますか…ありがとう!

 #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",&student2.name);

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

      return student2;
 }

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

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

3 に答える 3

7

書くつもりですか

void read_student_p(struct student* student3)
                                  ^
{    


read_student_p(&student1);
               ^

read_student_p渡すものを変更する場合は、へのポインタを渡す必要がありstructます。現在、値によって渡され、変更は失われます。

接尾辞を考えると、_pこれは意図されたものだと思います。

于 2013-03-21T03:06:43.997 に答える
1

これを行うとき:

read_student_p(student1);

そして、メソッドは次のようになります。

void read_student_p(struct student student3)
{    

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

 }

Cの構造体は、参照ではなく値で渡されます。

したがって、read_student_pが行うことは、渡した構造体(student1)のコピーを取り、そのコピーを編集して、何もしないことです。

1つの解決策は、変更されたバージョンの構造体を返すことです。別のバージョンは、構造体へのポインターを渡し、ポインターを介して構造体を編集することです(構造体の同じコピーを直接編集するように)。

于 2013-03-21T03:06:50.343 に答える
0

read_student_p値で呼び出していた2番目の関数、つまり、関数で新しい構造体変数を定義し、の値をこのtmp値tmpにコピーしました。student1行ったすべての変更はtmp値にあり、影響はありませんstudent1

于 2013-03-21T03:08:06.617 に答える