有人可以告诉我为什么这不起作用吗?

时间:2018-08-19 15:16:26

标签: c

因此,我正在编写一个程序,以扫描许多学生的姓名和成绩,然后向我显示所有平均年龄在85岁以上的学生。 我必须使用结构,并且说明说我必须借助strlen函数为名称动态分配内存。

#include<stdio.h>
#include<stdlib.h>
#include<string.h>

typedef struct stud
{
    char *name;
    int marks[4];
    float avg;
}student;


student* Create_Class(int);
void Avg_Mark(student*);
void Print_One(student*);


int main()
{
    int size, i;
    student *arr;
    printf("\nEnter the number of students: ");
    scanf("%d", &size);
    arr = (student*)malloc(size * sizeof(student));
    arr = Create_Class(size);
    for (i = 0; i < size; i++)
    {
        if ((arr + i)->avg > 85)
            Print_One(arr + i);
    }
    for (i = 0; i < size; i++)
        free((arr[i].name));
    free(arr);
    return 0;
}

student* Create_Class(int size)
{
    struct stud *Arr;
    int i, j, k;
    char YourName[51];
    int length;
    Arr = (struct stud*)malloc(size * sizeof(struct stud));
    for (i = 0; i < size; i++)
    {
        printf("Enter your name: ");
        scanf(" %s", YourName);
        length = strlen(YourName);
        (Arr + i)->name = (char*)malloc(length * sizeof(char));
        for (k = 0; k < length; k++)
            (Arr + i)->name[k] = YourName[k];
        (Arr + i)->name[k] = '\0';
        printf("Enter your marks: ");
        for (j = 0; j < 4; j++)
            scanf("%d", &(Arr + i)->marks[j]);
    }
    for (i = 0; i < size; i++)
        Avg_Mark(Arr + i);
    return Arr;
}


void Avg_Mark(student* s)
{
    int i;
    float sum = 0;
    for (i = 0; i < 4; i++)
    {
        sum += s->marks[i];
    }
    s->avg = sum / 4;
}


void Print_One(student* s)
{
    printf("The average of %s is %.1f\n", s->name, s->avg);
}

似乎问题在于释放主函数中的名称字段指针。 有人可以告诉我出了什么问题吗? 该代码本身非常简单,因此,如果有任何不清楚的地方,请随时提出,我将尽可能详细。

1 个答案:

答案 0 :(得分:2)

您的代码中有两个问题。

  1. 您正在通过调用C:\Tool

    覆盖arr内存

    create_class

    这将导致内存泄漏,因此只需删除arr = (student*)malloc(size * sizeof(student)); arr = Create_Class(size);

  2. 您没有为arr = (student*)malloc(size * sizeof(student));字段分配足够的内存。

    name

    应该{​​{1}}来容纳length = strlen(YourName); (Arr + i)->name = (char*)malloc(length * sizeof(char));个字符。