Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/55.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 有人能告诉我为什么这不是';不行吗?_C - Fatal编程技术网

C 有人能告诉我为什么这不是';不行吗?

C 有人能告诉我为什么这不是';不行吗?,c,C,所以我正在做一个程序,扫描一些学生的名字和成绩,然后给我看所有平均成绩为85+的学生。 我需要使用结构,指令中说我必须借助strlen函数为名称动态分配内存 #include<stdio.h> #include<stdlib.h> #include<string.h> typedef struct stud { char *name; int marks[4]; float avg; }student; student* Crea

所以我正在做一个程序,扫描一些学生的名字和成绩,然后给我看所有平均成绩为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);
}
#包括
#包括
#包括
类型定义结构螺柱
{
字符*名称;
整数分[4];
浮动平均值;
}学生;
学生*创建_类(int);
无效平均分数(学生*);
无效打印(学生*);
int main()
{
int大小,i;
学生*arr;
printf(“\n输入学生人数:”);
scanf(“%d”,大小(&S);
arr=(学生*)malloc(大小*sizeof(学生));
arr=创建类(大小);
对于(i=0;i平均值>85)
打印一份(arr+i);
}
对于(i=0;iname=(char*)malloc(length*sizeof(char));
对于(k=0;kname[k]=你的名字[k];
(Arr+i)->名称[k]='\0';
printf(“输入您的标记:”);
对于(j=0;j<4;j++)
scanf(“%d”和(Arr+i)->标记[j]);
}
对于(i=0;i标记[i];
}
s->avg=sum/4;
}
作废打印单(学生)
{
printf(“%s的平均值为%.1f\n”,s->name,s->avg);
}
问题似乎在于释放主函数中的名称字段指针。 有人能告诉我出了什么问题吗?
代码本身非常简单,因此如果有任何不清楚的地方,请随时询问,我会尽量详细说明。

您的代码中有两个问题

  • 通过调用
    create\u类

    arr=(学生*)malloc(大小*sizeof(学生));
    arr=创建类(大小)

    这将导致内存泄漏,所以只需删除
    arr=(student*)malloc(size*sizeof(student))

  • 您没有为
    名称
    字段分配足够的内存

    length=strlen(你的名字);
    (Arr+i)->name=(char*)malloc(length*sizeof(char))

    应该是
    length=strlen(你的名字)+1
    以保持
    null
    char


  • 您可以直接执行
    arr=…
    ,后面紧跟
    arr=…
    (作业的右侧与此无关)。想一想你在那里做了什么。至于你的问题,你似乎记得字符串需要终止,但你从来没有为终止符分配空间。到底是什么让你认为有问题?程序是否没有输出正确的结果?有错误吗?告诉我们,这段代码中有一个错误,它破坏了堆。必须分配长度+1个字符,以确保有足够的空间容纳最后的零。像strpy_s()这样的安全CRT函数可以帮助您发现这样的错误。另一个不相关的注意事项是,对于任何指针
    p
    和索引
    i
    ,表达式
    *(p+i)
    完全等于
    p[i]
    。这意味着您可以使用
    Arr[i].name来代替
    (Arr+i)->name
    。意思完全相同,但写起来更短,更容易阅读,更容易理解。