2017-01-14 3 views
-1

構造体を学習しようとしていますが、以下のコードでは論理的ではなくエラーが発生していますが、実行中にファイルが停止しています。 gets(s2.name)の直後に発生する構造体で使用するとプログラムがハングします

#include<stdio.h> 
struct student 
{ 
    char *name; 
    float mark1,mark2,mark3; 
    float total; 
}; 
int main() 
{ 
struct student s1,s2,s[3]; 
s1.mark1=6;s1.mark2=7;s1.mark3=8; 
s1.total = s1.mark1+s1.mark2+s1.mark3; 
printf("\nEnter the name of s2 : "); 
gets(s2.name); 
/*when above line is inserted program hangs and code below does not execute*/ 
puts(s2.name); 
s1.name = "shanky"; 
puts(s1.name); 
getch(); 
return 0; 
} 

明らかにコンパイルエラーはありません。 gccコンパイラの使用

+1

不確定の間に自動保存期間を持つオブジェクトの値を使用するための未定義の動作。 – EOF

+1

1行につき1つのステートメントが有効です。すなわち、 - >新しい行を始める –

+3

['gets()'を使わないで、危険です。](http://stackoverflow.com/q/1694036/2173917)。代わりに['fgets()'](https://linux.die.net/man/3/fgets)を使用してください。 –

答えて

4

構造体のnameメンバにメモリを割り当てるのを忘れています。これはポインタですが、メモリをmalloc()しないと、どこにポインタがあるのか​​分かりません。

s2.name = malloc(80)のようなものを試してみてください。戻り値を確認し、gets()が安全でないことに注意してください。プロダクションコードでは使用しないでください。 (あるいは、gets()をまったく使用しないでください)。

+0

'あなたがmalloc()some memory'..stを別の静的に割り当てられた変数へのポインタの割り当てについて? –

+0

@SouravGhosh:これは1つの構造変数に対して機能します。そのタイプの変数が2つ以上あるときには、急速にそれは支持されなくなります。 –

関連する問題