2016-11-20 8 views
0

動的に割り当てられた2つの構造をスワップしようとしています。しかし、文字列(名前)のみが入れ替わります。誰でも私のスニペットに何が間違っているのかを教えてくれる。動的割り当て構造のスワップ

typedef struct 
{ 
char name[20]; 
int num; 
char ch; 
}student; 

void swap(student **a,student **b) 
{ 
     student *temp; 
     temp = *a; 
     *a = *b; 
     *b = temp; 

} 

void main() 
{ 

     student *s; 
     int i; 
     s = (student *)malloc(10 * sizeof(student)); 

     printf("enter values: "); 

     for(i=0;i<10;i++) 
       scanf("%d %c %s",&s[i].num,&s[i].ch,s[i].name); 

     swap(s+3,s+4); 

     printf("\n"); 
     for(i=0;i<10;i++) 
       printf("%d %c %s\n",s[i].num,s[i].ch,s[i].name); 


     printf("\n"); 
} 

+0

各構造体は、個別に動的に割り当てられません。動的に割り当てられた単一の構造体のシーケンス内にある2つの構造体を交換しようとしています。あなたはポインタを交換することでそれをするつもりはありません。この中には 'main()'の 's'という可変ポインタしかありません。 – WhozCraig

+0

'スワップ(swap) '機能の*ポインタごとに1レベルのインダイレクションを失います。 2つのパラメータは 'student *'でなければならず、 'temp'はポインタではありません。残りは同じままです。 – WhozCraig

答えて

1

機能swap()はタイプstudent **の2つのパラメータを取得します。 しかし、swap(s+3,s+4);コールでは、タイプstudent *の2つの引数を渡します。タイプはsです。あなたはそれをまったくコンパイルできますか?

とにかく、各ポインタがを指しているのコンテンツを置き換えているのは、swap()の機能です。つまり、学生に2つのポインタがある場合(つまり、p1は学生s1を指し、p2は学生s2を指している)、swap(&p1, &p2)を呼び出して他の学生を指し示すことができます(つまり、 p1からs2、p2からs1)。

main()のコードでは、studentへのポインタを扱っていません。むしろ、学生自身の内容を置き換えようとします。これは、swap()がまったく行わないものです。

+0

がコンパイルされ、エラーは発生しません。構造体全体ではなく構造体間でスワップするだけです。 アドレススワップ(&s [3]、&s [4])を渡そうとしましたが、構造体全体ではなく名前だけが交換されています – Nazeem

+0

アドレススワップはポインタを使用する場合にのみ機能します。修正された答えをお読みください。 – Mike

0

ポインタは同じメモリ位置を参照しています。別の生徒ポインタを使用してみてください。たとえば、別の生徒* s2を宣言してください。

関連する問題