2016-03-25 4 views
-4

リストに格納して表示しようとしていますが、表示機能を呼び出すときにこのエラーが発生します。問題が何であるかわからないので、警告やエラーが出ることはありません。私は誰もがそう将来の使用のために、エラーがあまりにもそれをいただければ幸いです何を意味するかを説明することができた場合リストを表示しようとすると、読み取りアクセス違反(0xCCCCCCD0)

void displayAll(struct list_el *pointer) { 

    struct list_el *temp; 
    temp = pointer; 

    if (pointer == NULL) { 
     printf("Nothing to Display"); 
    } 

    else { 
     while (temp != NULL) { 
      printf("\nDisplaying All Surveys\n"); 
      printf("Name: %s %s", temp->data.firstName, temp->data.lastName); 
      printf("\nPPS: %d", temp->data.ppsNo); 
      printf("\nAddress: %s", temp->data.address); 
      printf("\nAddress: %s", temp->data.email); 

      // Switch statement that determines the age group depending on the value 
      switch (temp->data.age) { 
      case 1: 
       printf("\n18 - 20"); 
       break; 

      case 2: 
       printf("\n20 - 30"); 
       break; 

      case 3: 
       printf("\n30 - 50"); 
       break; 

      case 4: 
       printf("\n50 - 65"); 
       break; 

      case 5: 
       printf("\n65+"); 
       break; 
      } 

      switch (temp->data.income) { 

      case 1: 
       printf("\nNo Income"); 
       break; 

      case 2: 
       printf("\nLess than 20,000"); 
       break; 

      case 3: 
       printf("\nLess than 40,000"); 
       break; 

      case 4: 
       printf("\nLess than 60,000"); 
       break; 

      case 5: 
       printf("\nLess than 80,000"); 
       break; 

      case 6: 
       printf("\nLess than 100,000"); 
       break; 

      case 7: 
       printf("\nGreater than 100,000"); 
       break; 
      } 

      switch (temp->data.age) { 

      case 1: 
       printf("\nMale"); 
       break; 

      case 2: 
       printf("\nFemale"); 
       break; 
      } 

      switch (temp->data.exercise) { 

      case 1: 
       printf("\t1: Never\n"); 
       break; 

      case 2: 
       printf("\nExercises less than three times per week"); 
       break; 

      case 3: 
       printf("\nExercises less than five times per week"); 
       break; 

      case 4: 
       printf("\n Exercises more than five times per week"); 
       break; 
      } 

      switch (temp->data.alcohol) { 

      case 1: 
       printf("\nNo Units\n"); 
       break; 

      case 2: 
       printf("\nLess than 2 Units per week"); 
       break; 

      case 3: 
       printf("\nLess than 3 Units per week"); 
       break; 

      case 4: 
       printf("\nMore than 4 Units per week"); 
       break; 
      } 

      switch (temp->data.cigarettes) { 

      case 1: 
       printf("\nNo Cigarettes"); 
       break; 

      case 2: 
       printf("\nLess than 20 cigarettes per week"); 
       break; 

      case 3: 
       printf("\nLess than 40 cigarettes per week"); 
       break; 

      case 4: 
       printf("\nMore than 40 cigarettes per week"); 
       break; 
      } 

      temp = temp->next; 
     } 
    } 

} 

を表示するには、値

void addSurvey(struct list_el** pointer) { 

    struct list_el* data; 
    data = (struct list_el*)malloc(sizeof(struct list_el)); 

    printf("\n===== Adding Someone to the Survey =====\n"); 

    // Depending on the number added, they output will be different 
    // Taking in details and passing through the list 
    printf("Enter PPS Number: "); 
    scanf("%d", &data->data.ppsNo); 
    printf("Enter First Name: "); 
    scanf("%s", data->data.firstName); 
    printf("Enter Last Name: "); 
    scanf("%s", data->data.lastName); 
    printf("Enter Address: "); 
    scanf("%s", data->data.address); 
    printf("Enter Email Address: "); 
    scanf("%s", data->data.email); 

    // Number added will determine the age group 
    printf("\nEnter age group\n"); 
    printf("\t1: 18 - 20\n"); 
    printf("\t2: 20 - 30\n"); 
    printf("\t3: 30 - 50\n"); 
    printf("\t4: 50 - 65\n"); 
    printf("\t5: 65+\n"); 
    scanf("%d", &data->data.age); 

    if (data->data.age > 5 && data->data.age < 1) { 
     printf("Error - Re Enter Age group\n"); 
     scanf("%d", &data->data.age); 
    } 

    // Number added will determine income group 
    printf("\nIncome Bracket - What category do you fall under\n"); 
    printf("\t1: No Income\n"); 
    printf("\t2: Less than 20,000\n"); 
    printf("\t3: Less than 40,000\n"); 
    printf("\t4: Less than 60,000\n"); 
    printf("\t5: Less than 80,000\n"); 
    printf("\t6: Less than 100,000\n"); 
    printf("\t7: Greater than 100,000\n"); 
    scanf("%d", &data->data.income); 

    if (data->data.income > 7 && data->data.income < 1) { 
     printf("Error - Re Enter Income\n"); 
     scanf("%d", &data->data.income); 
    } 

    // Number added will determine gender 
    printf("\nGender\n"); 
    printf("\t1: Male\n"); 
    printf("\t2: Female\n"); 
    scanf("%d", &data->data.gender); 

    if (data->data.gender > 2 && data->data.gender < 1) { 
     printf("Error - Re Enter Gender\n"); 
     scanf("%d", &data->data.gender); 
    } 

    // Number will be added to determine how often they exercise 
    printf("\nExercise - How often do you exercise\n"); 
    printf("\t1: Never\n"); 
    printf("\t2: Less than three times per week\n"); 
    printf("\t3: Less than five times per week\n"); 
    printf("\t4: More than five times per week\n"); 
    scanf("%d", &data->data.exercise); 

    if (data->data.exercise > 4 && data->data.exercise < 1) { 
     printf("Error - Re Enter Exercise\n"); 
     scanf("%d", &data->data.exercise); 
    } 

    // Number will be added to determine how many units they drink 
    printf("\nAlcohol - How many units of Alcohol do you drink per week\n"); 
    printf("\t1: None\n"); 
    printf("\t2: Less than 2 Units per week\n"); 
    printf("\t3: Less than 3 Units per week\n"); 
    printf("\t4: More than 4 Units per week\n"); 
    scanf("%d", &data->data.alcohol); 

    if (data->data.alcohol > 4 && data->data.alcohol < 1) { 
     printf("Error - Re Enter Alcohol\n"); 
     scanf("%d", &data->data.alcohol); 
    } 


    // Number will be added to determine how many cigarattes per week they smoke 
    printf("\nCigarettes - How many Cigarettes do you smoke per week\n"); 
    printf("\t1: None\n"); 
    printf("\t2: Less than 20 cigarettes per week\n"); 
    printf("\t3: Less than 40 cigarettes per week\n"); 
    printf("\t4: More than 40 cigarettes per week\n"); 
    scanf("%d", &data->data.alcohol); 

    if (data->data.alcohol > 4 && data->data.alcohol < 1) { 
     printf("Error - Re Enter Alcohol\n"); 
     scanf("%d", &data->data.alcohol); 
    } 

} 

機能を取り込む

typedef struct { 

    // Variables - Details on person taking survey 
    int ppsNo; 
    char firstName[15]; 
    char lastName[15]; 
    char address[30]; 
    char email[30]; 

    // Groups - Statistics are broken down based on these groups 
    int age; 
    int income; 
    int gender; 

    // Survey - What the survey questions will consist of 
    int exercise; 
    int alcohol; 
    int cigarettes; 

}survey_t; // Structure defined 

struct list_el{ 

    survey_t data; 
    struct list_el* next; 
}; // List for passing values into the struct 

私は将来それに対処する方法を知っています。

+0

読み取り、アクセス違反は、あなたがそのアドレスを読んでいないことを意味し、新しい要素のnextを初期化する必要があります

*pointer = data; 

:あなたのような何かが欠けています。アドレスは、デバッグセンチネル値、すなわち、デバッグを支援するために「明らかに間違っている」ようにメモリに書き込まれたもののように見える。私はおそらくメモリを解放した後にメモリを使用したと推測します(コードを読まずに)。デバッグモードでは、メモリマネージャは解放されたメモリをそのようなセンチネル値で上書きすることがありますが、これはコンパイラおよびプラットフォームに依存し、プラットフォームについては言及していません。 – Ben

+0

デバッガ.................................. –

答えて

1

未初期化ポインタ。デバッグモードでは、スタックは通常、高速なエラー検出のために0xCC値で埋められます。

0

エラーは、不正なアドレスのメモリにアクセス(読み取り/書き込み)しようとしていることを意味します。通常これは、不正なポインタ値を間接参照することを意味します。

あなたのリストは不完全なようです。このコードで

:それはそう

void addSurvey(struct list_el** pointer) { 

    struct list_el* data; 
    data = (struct list_el*)malloc(sizeof(struct list_el)); 
    ... 

あなたはpointerを使用することはありません。つまり、新しい要素をリストに追加しないようです。また、あなたは(おそらくそれが存在しないため)、すなわち

data->next = NULL; 
関連する問題