2014-01-26 43 views
0

掃描完第二個元素後,程序崩潰。它不能去掃描第三個元素(即等級)。需要幫助,弄清楚我錯了什麼。動態內存分配的簡單結構

#include<stdio.h> 
#include<stdlib.h> 
#define NUM 2 
typedef struct STUDENT 
{ 
    int ID; 
    char *name; 
    char *grade; 
}; 
int main() 
{ 
     int i; 
    struct STUDENT *s; 
    s = (struct STUDENT*)malloc(NUM*sizeof(struct STUDENT*)); 
    printf("Enter Student's ID, Name and Grade:\n"); 
    for(i=0;i<NUM;i++) 
    { 
     printf("Enter ID:\n"); 
     scanf("%d", &(s+i)->ID); 
     printf("Enter Student Name:\n"); 
     scanf("%s", (s+i)->name); 
     printf("Enter Grade:\n"); 
     scanf("%s", (s+i)->grade); 
     printf("\n"); 
    } 
    printf("\nInformation of the student's are:\n"); 
    for(i=0;i<NUM;i++) 
    { 
     printf("Student ID = %d\n", (s+i)->ID); 
     printf("Student Name = %s\n", &(s+i)->name); 
     printf("Student grade = %c\n", &(s+i)->grade); 
     printf("\n"); 
    } 
    return 0; 
} 

回答

3

您不會爲struct STUDENT中的gradename分配內存。嘗試讀取輸入並將其寫入它們會產生未定義的行爲。

添加必要malloc s,例如:與給定的最大長度STR_MAX

s[i].name = malloc(STR_MAX); 
s[i].grade = malloc(STR_MAX); 

查看進一步的錯誤其他的答案。

3
malloc(NUM*sizeof(struct STUDENT*)); 

應該

malloc(NUM*sizeof(struct STUDENT)); 

此外,namegrade沒有緩衝器,但指針。您可能需要一個緩衝區(char數組)或爲其動態分配內存。

2
  1. struct STUDENT *s;應聲明如下:

    STUDENT *s; 
    
  2. 無需從mallocvoid *。此行s = (struct STUDENT*)malloc(NUM*sizeof(struct STUDENT*));改成這樣:

    s = malloc(NUM * sizeof(*s)); 
    
  3. 取而代之的是scanf("%d", &(s+i)->ID);,下面可能會更易於理解:

    scanf("%d", &s[i].ID); 
    
  4. 同樣在這裏:

    printf("Student ID = %d\n", s[i].ID); 
    
  5. 最重要的是,納布拉說了什麼。

1
typedef struct STUDENT 
{ 
    int ID; 
    char *name; 
    char *grade; 
}; 

這裏的名字和年級字符類型指針。所以當你malloc結構的時候你也必須給malloc名字和檔次太