【发布时间】:2019-08-23 05:14:35
【问题描述】:
来自外部编译器的新图片..退出代码正常吗?
这是完整的代码。在将想要的输出打印到屏幕后,我遇到了一个故障程序。我想这是我为结构数组分配内存的方式以及 for 循环中每个结构的 .name 字段的问题。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <conio.h>
#define MAX_NAME_LEN 50
typedef struct stud
{
char *name;
int marks[4];
float avg;
}student;
student* Create_Class(int);
void Avg_Mark(student*);
void Print_One(student*);
void printExcellent(student*);
void main()
{
int size, i;
student *arr, *newArr;
printf("\nEnter the number of students: ");
scanf_s("%d", &size);
newArr = Create_Class(&size);
for (i = 0; i < size; i++)
{
printExcellent(newArr+i);
}
for (i=0;i<size;i++) free(newArr[i].name);
free(newArr);
_getch();
}
student* Create_Class(int size)
{
student *p;
char str[MAX_NAME_LEN];
int i, j;
p = (student*)calloc(size , sizeof(student));
if (!p)
{
printf("Memory allocation failure.");
exit(1);
}
for (i = 0; i < size; i++)
{
printf("Enter your name: ");
rewind(stdin);
gets(str);
p[i].name = (char*)calloc(strlen(str)+1,sizeof(char));
if (!(p[i].name))
{
printf("Memory allocation error!");
exit(1);
}
strcpy_s(p[i].name,50,str);
printf("Enter your marks: ");
for (j = 0; j < 4; j++)
{
scanf_s("%d", &p[i].marks[j]);
}
Avg_Mark(p + i);
}
return p;
}
void Avg_Mark(student* s)
{
int i, sum=0;
for (i = 0; i < 4; i++)
sum += s->marks[i];
s->avg = (float)sum / 4;
}
void Print_One(student* s)
{
printf("The average of %s is %.1f\n", s->name, s->avg);
}
void printExcellent(student* s)
{
if ((s->avg) > 85)
Print_One(s);
}
【问题讨论】:
-
您错过了发布功能代码。
-
请贴出你的完整代码,可能
str分配不足是罪魁祸首。无论如何gets()有点邪恶,并且 rewind(stdin) 是一个无操作在最好的情况下 -
student* Create_Class(int);和newArr = Create_Class(&size);???你传递的论点真的正确吗? -
经验法则是:首先消除所有警告,然后寻求帮助。
-
正如我所写:它与您发布的代码不同。您应该可以从某处的菜单中调整设置级别。
标签: c structure dynamic-memory-allocation