2016-08-03 15 views
0
#include <stdio.h> 
#include <stdlib.h> 

int main() 
{ 
    int size,choice; 
    printf("student size:\n"); 
    scanf("%d", &size); 

    typedef struct 
    { 
     int age; 
     double gpa; 
     char name[]; 
    }STUDENT; 
    STUDENT *array = (STUDENT *) malloc(sizeof(STUDENT) * size); 
    printf("\n(1) Add a student\n(2) Delete a student\n(3) Save all students\n(4)Quit\n"); 
    scanf("%d",&choice); 
    while (choice != 4){ 
     switch (choice) { 
      STUDENT temp; 
      STUDENT *tempptr = &temp; 
      int cellNum; 
      case 1: 
       printf("Enter age gpa and name:\n"); 
       scanf("%d %f %s",&tempptr->age,&tempptr->gpa,&tempptr->name); 
       printf("Enter cell number:\n"); 
       scanf("%d", &cellNum); 
       if (cellNum > (size-1)){ 
        printf("Invalid cell number\n"); 
        break; 
       }else{ 
        *(array + cellNum) = temp; 
       } 
      case 3: 
       printf("stupid c syntax rules"); 
       FILE *p = fopen("students.txt","w"); 
       int i = 0; 
       for (i=0; i<size; i++){ 
        fprintf(p, "%d, %f, %s\n",*(array+i).age,*(array+i).gpa,*(array+i).name); 
       } 
     } 
     printf("\n(1) Add a student\n(2) Delete a student\n(3) Save all students\n(4)Quit\n"); 
     scanf("%d",&choice); 
    } 

    return 0; 
} 

エラーを取得:Cの動的構造体のエラー

main.c:40:56: error: request for member 'age' in something not a structure or union          
        fprintf(p, "%d, %f, %s\n",*(array+i).age,*(array+i).gpa,*(array+i).name);        
                 ^                
main.c:40:71: error: request for member 'gpa' in something not a structure or union          
        fprintf(p, "%d, %f, %s\n",*(array+i).age,*(array+i).gpa,*(array+i).name);        
                    ^            
main.c:40:86: error: request for member 'name' in something not a structure or union          
        fprintf(p, "%d, %f, %s\n",*(array+i).age,*(array+i).gpa,*(array+i).name); 

ですが、なぜでしょうか? ありがとう

+0

'char name [];'はサイズが必要です。 – BLUEPIXY

答えて

1

.演算子は、単精度*here参照)よりも高い優先度です。だから最初に(逆参照する前に)コンパイラはageフィールドを構造体ではなくポインタである(array+i)に見つけようとしています。
*(array+i).age(array+i)->ageまたは(*(array+i)).ageのいずれかに置き換えます。

+0

ありがとう、それはエラーを解決しました! scanf( "%d%f%s"、&tempptr-> age、&tempptr-> gpa、&tempptr-> name)という行を実行した後、セグメンテーションを取得しました。何が問題なのか知っていますか? C – throwawayguy

+0

に申し訳ありませんこれは別の問題です。 –

+0

私は知っている、それはかなり小さいと思われるので私が聞くかもしれないと思った。 – throwawayguy

関連する問題