4.11课程作业-吴佳旎

从堆区申请能存5个结构体变量的数组的空间,完成数组中成员的输入,根据学生成绩,用选择排序的方式,对学生排序并输出

#include <stdlib.h>

typedef struct {   // 先定义学生的结构体

   int id;/ID

   char name[50];   //姓名

   float score;    //成绩

} Student;

 

int compare(const void *a,const void *b) {  //比较函数,用来选择排序

     Student *studentA=(Student *)a;

     Student *studentB=(Student *)b;

     return studentA->score - studentB ->score;

}

 

int main(){

     Student *students =(Student *)malloc(5 * sizeof(Student));//从堆区申请5个结构体变量的数组的空间

     if(students == NULL){

       printf(“内存分配失败”);

       return EXIT_FAILURE;

}

 

for(int i=0;i<5;i++){   //输入组中成员信息

 printf("输入学生信息 %d:\n",i+1);

printf("ID:");

scanf("%d",&students[i].id);

printf("Name:");

scanf("%s",students[i].name);

printf("Score:");

scanf("%f",&students[i].score);

}

 

qsort(students,5,sizeof(Student),compare);//使用选择排序对学生按成绩排序

 

printf(“按分数排序的学生\n:");

for(int i=0;i<5;i++){

printf("ID:%d Name:%s Score:%.2f\n",students[i].id,students[i].name,students[i].score);

}

 

free(students);

return 0;

}

求以下结构体的大小

typedef struct {

    int  id;

    char name[50];

    char grade[3];

} student;

 

typedef struct {

    int id;

    char name[50];

    student student;

} Teacher;

 

typedef struct {

    int id;

    char name[50];

    Teacher teacher;

}  Course;

先计算student的结构体

int id;id成员占用4个字节,

char name;name成员是一个一维字符数组,占用了50个字节,

char grade;grade成员是一个一维字符数组,占用了3个字节

正常计算是 4+50+3=57个字节,但是由于结构体大小会满足字节对齐的原则,正常按照4的倍数进行对齐  也就是60字节  正好是4的倍数

接下来计算Teacher的结构体

int id;id成员占用4个字节,

char name;name成员是一个一维字符数组,占用了50个字节,

student student;student成员是前面计算的 student结构体的大小,按60字节来计算

也就是4+50+60=114字节  ,如果对齐的话  是116字节

最后计算Course的结构体

int id;id成员占用4个字节,

char name;name成员是一个一维字符数组,占用了50个字节,

Teacher teacher;teacher成员是前面计算的 teacher的结构体大小  按116字节来算

就是 4+50+116=170个字节大小 ,如果对其的话  是172个字节  正好是4的倍数,

具体情况需要具体看操作系统的对齐量,32位操作系统默认4字节对齐,64位操作系统默认8字节对齐。

  • 4
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Yoyozi_wu

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值