动态内存分配的简单结构

时间:2014-01-26 05:47:44

标签: c struct

扫描完第二个元素后,程序崩溃了。它无法扫描第三个元素(即等级)。需要帮助,弄清楚我错了什么。

#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;
}

4 个答案:

答案 0 :(得分:3)

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

应该是

malloc(NUM*sizeof(struct STUDENT));

此外,namegrade不是缓冲区而是指针。您可能需要一个缓冲区(char数组)或动态分配内存。

答案 1 :(得分:3)

您不会在grade中为namestruct STUDENT分配内存。尝试读取输入并将其写入它们会产生未定义的行为。

添加必要的malloc,例如,给定的最大长度STR_MAX

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

有关更多错误,请参阅其他答案。

答案 2 :(得分:2)

  1. struct STUDENT *s;应该像这样声明:

    STUDENT *s;
    
  2. 无需从void *投射malloc。将此行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. 最重要的是,纳布拉所说的。

答案 3 :(得分:1)

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

这里是名称和等级字符类型指针。因此,当你使用malloc结构时,你也必须使用malloc名称和等级