簡體   English   中英

具有動態內存分配的簡單結構

[英]Simple structure with dynamic memory allocation

掃描第二個元素后,程序立即崩潰。 它無法進行第三個元素(即等級)的掃描。 需要幫助,找出我錯在哪里錯。

#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;
}
malloc(NUM*sizeof(struct STUDENT*));

應該

malloc(NUM*sizeof(struct STUDENT));

同樣, namegrade也不是緩沖區,而是指針。 您可能需要緩沖區(字符數組)或為其動態分配內存。

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

添加必要的malloc ,例如具有給定的最大長度STR_MAX

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

有關其他錯誤,請參見其他答案。

  1. struct STUDENT *s; 應該這樣聲明:

     STUDENT *s; 
  2. 無需從malloc轉換void * 更改此行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. 最重要的是,納布拉說了什么。

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

這里是名稱和等級字符類型的指針。 因此,當您使用malloc結構時,您也必須同時分配名稱和等級

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM