2016-04-22 19 views
1

2人(それは正常に動作します) 何人の学生:4人(「アクセス違反があなたのプログラムで発生しました。プログラム内でアクセス違反(セグメンテーション違反)が発生しました

それは私と一緒に起こっている理由を、私は4時間を費やしているが、それを把握することができませんでした。

#include <stdio.h> 


struct student 
{ 
    int rollno; 
    char name[20]; 
}; 

int main() 
{ 
    int n,i,j; 

    struct student detail[n]; 

    printf("how many students: "); 
    scanf("%d",&n); 
    fflush(stdin); 

    for(i=0; i<n; i++) 
    {    
     printf("enter student no.%d\n",(i)); 
     printf("Name: "); 
     gets(detail[i].name); 
     printf("Roll No: "); 
     scanf("%d",&detail[i].rollno); 
     fflush(stdin); 
    } 

    for(i=0; i<n; i++) 
    { 
     printf("Student no. %d Detail\n",(i+1)); 
     printf("Name:\t\t%s \nRoll No: \t%d\n",detail[i].name,detail[i].rollno); 
    } 

    getch(); 
} 
+1

fflush(stdin);はUB –

+0

です。デバッガ................................ –

+0

@この場合、デバッグする必要はありません。警告をオンにすれば十分です。P –

答えて

4

をあなたのコードでは、主な問題は、USIあなたがしている

int n,i,j; 
struct student detail[n]; 

ですng n未初期化。それはundefined behaviorを呼び出します。 detail[n];の定義をの後にユーザーからスキャンした後に移動する必要があります。言っ

、成功を確実にするscanf()の戻り値の

  1. チェック。
  2. gets()は、バッファオーバーフローを引き起こす可能性があるため危険です。代わりにfgets()を使用してください。
  3. 標準に従って、fflush(stdin)はUBですが、これを削除してください。
  4. getch()は、stdio.hが含まれている場合、getchar()である必要があります。
+1

@AlterMann拡張機能をお寄せいただきありがとうございます。別の角度から情報を追加しました:) –

+0

感謝致しました。 'n'の代わりにfflushの代わりにgetchar()を使用しました。 –

関連する問題