2017-07-03 19 views
-2

私は何時間も進歩していませんでした。 scanf()が呼び出されたときに私のプログラムがクラッシュする理由を知る必要があります。エラーメッセージ:「セグメンテーションフォールト;コアがダンプされました」は、ダイナミックアレイにメモリを正しく割り当てていないと考えられます。この場合、配列に1つの構造体を追加するためにメモリを正しく割り当てる方法を教えてもらえますか?私は、メニューから三番目のオプションを選択し、それが配列を反復処理し、各講師の名前を印刷する必要がありますが、私が得るすべては私が帰属空白行と最後のインストラクター名ですいくつかのインストラクターの名前を入力した後* char []に文字列を書くことができません

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

/* 
* 
*/ 


enum Subject{ 
    SER = 0, EGR = 1, CSE = 2, EEE = 3 
}; 
struct Course{ 
    enum Subject sub; 
    int number; 
    char instructor_name[1024]; 
    int credit_hours; 
}*course_collection; 


int total_courses = 0; 
int total_credits = 0; 
void course_insert(); 
void resizeArray(); 


int main(int argc, char** argv) { 
    int choice = 0; 
    while(choice != 4){ 
    printf("Welcome to ASU, please choose from the menu" 
      "choices.\n\n"); 
    printf("_____________________________________________\n\n"); 

    printf("Menu:\n 1.Add a class\n 2. Remove a class\n" 
      " 3.Show classes\n 4.Quit"); 
    printf("\n\nTotal credit hours: %d\n\n", total_credits); 


    printf("\n\n_________________________________________"); 
    scanf("%d", &choice); 

    if(choice == 1){ 
     resize_array(total_courses); 
     course_insert(); 
    } 

    else if(choice == 3) 
     print_courses(); 

    } 
    return (EXIT_SUCCESS); 

} 

void resize_array(int total_courses) { 
    course_collection = malloc(total_courses + 
      sizeof(course_collection)); 
} 

void print_courses() { 
    int i; 
    for(int i = 0; i < total_courses; i++){ 
     printf("\nInstructor: %s\n\n", 
       course_collection[i].instructor_name); 
    } 
} 

void course_insert(){ 
    printf("\n\nEnter the instructor's name\n\n"); 
    scanf("%s" , course_collection[total_courses].instructor_name); 
    total_courses++; 
} 
//will crash just after scanf(); 
//must press 1 & enter for correct output 

UPDATE @ user3545894私はこれを試しましたが、うまくいくように見えますが、出力が正しくないという問題がまだ発生します。私は配列を繰り返し処理し、各添え字に文字列を出力することができます。

+0

{注意深く 'N' ではない観察}喜びeこれを問題を再現する[mcve]に減らします。または、独自のデバッガでコードをステップ実行します。 –

+0

このコードが動作する理由はわかりません。実際に配列を作成することはありません。 –

+1

コンパイラの警告を有効にします。 – EOF

答えて

2

問題は、あなたが唯一のcourse_collectionのポインタの配列を割り当てのmalloc(total_courses +はsizeof(course_collection))

から来ました。 あなたはそれがmalloc関数でなければなりません

構造体のコース全体のためにメモリを割り当てる必要があります(total_coursesに*はsizeof(構造体コース))

0

ユーザーこれはmalloc(total_courses +はsizeof(構造体コース))の代わりにmalloc関数の大部分配列 ARRのメモリ割り当てに(total_courses +はsizeof(course_collection))

セグメンテーション違反[n]は、我々が 'N-1' と '0' になるまで、それを使用

関連する問題