首页 > 系统相关 >c语言中,结构体变量交换改写为堆空间申请内存

c语言中,结构体变量交换改写为堆空间申请内存

时间:2024-06-03 19:30:54浏览次数:17  
标签:变量 num2 struct1 sss 改写 内存 scores 成绩 name

        在这里我实现的功能为:输入三个人的信息,每个人的信息分别为姓名和三个成绩,我分别计算三个人的成绩和,并通过经典的三杯水案例完成对三个人的成绩从小到大的排列打印。

重点:

        我这里使用的为堆空间申请内存的形式

 第一步:

        定义一个结构体,其中包含姓名和三个人成绩的数组;

struct struct1
{
    char *name;   //姓名
    float scores[3];   //成绩数组
};

        当中,结构体名: struct struct1太长,我们可以使用typedef命别名,如下:

typedef struct struct1 sss;   //命别名为sss

         命别名为sss;

整体代码如下:

#include <Windows.h>
#include <math.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>

struct struct1
{
    char *name;      // 姓名
    float scores[3]; // 成绩数组
};
typedef struct struct1 sss; // 命别名为sss

int main()
{
    sss num1[3];        //声明3个人的结构体数组
    sss *num2 = (sss *)malloc(sizeof(num1) * 10);           //申请结构体堆空间申请内存
    //遍历输入
    for (int i = 0; i < 3; i++)
    {
        (num2 + i)->name = (char *)malloc(sizeof(char) * 10);
        printf("请输入姓名:");
        scanf("%s", (num2 + i)->name);
        printf("请输入成绩1:");
        scanf("%f", &(num2 + i)->scores[0]);
        printf("请输入成绩1:");
        scanf("%f", &(num2 + i)->scores[1]);
        printf("请输入成绩1:");
        scanf("%f", &(num2 + i)->scores[2]);
    }
    //遍历循环判断,从小到大排列
    for (int i = 0; i < 3 - 1; i++)
    {
        for (int j = 0; j < 3 - 1 - i; j++)
        {
            float x = (num2 + j)->scores[0] + (num2 + j)->scores[1] + (num2 + j)->scores[2];
            float y = (num2 + j + 1)->scores[0] + (num2 + j + 1)->scores[1] + (num2 + j + 1)->scores[2];
            if (x > y)
            {
                sss num;
                num = num2[j];
                num2[j] = num2[j + 1];
                num2[j + 1] = num;
            }
        }
    }
    for (int i = 0; i < 3; i++)
    {
        printf("姓名为:%s     成绩为:%.2f   %.2f   %.2f \n\n", (num2 + i)->name, (num2 + i)->scores[0], (num2 + i)->scores[1], (num2 + i)->scores[2]);
    }
    for (int i = 0; i < 3; i++)
    {
        free((num2 + i)->name);
        (num2 + i)->name = NULL;
    }
    free(num2);
    num2 = NULL;
    system("pause");
    return 0;
}

        首先:定义了一个结构体struct1,其中包含学生的姓名(name)和三门课程的成绩数组(scores)。

        然后:通过typedef将struct1命名为sss以简化代码。在main函数中,声明了一个包含3个sss结构体的数组num1,并使用malloc函数动态分配了一个大小为3的sss结构体数组num2。

        接下来:通过for循环遍历输入学生的姓名和成绩,并将其存储在num2数组中。然后,使用嵌套的for循环对学生按照总成绩从小到大进行排序。

        最后:使用另一个for循环打印出排序后的学生姓名和成绩,并使用free函数释放动态分配的内存,防止内存泄漏。整个程序实现了学生信息的输入、排序和输出功能。

        

标签:变量,num2,struct1,sss,改写,内存,scores,成绩,name
From: https://blog.csdn.net/weixin_47378530/article/details/139421195

相关文章

  • x264 参考帧管理原理:i_poc 变量
    POCH.264中的POC(PictureOrderCount)用于表示解码帧的显示顺序。当视频码流中存在B帧时,解码顺序和显示顺序可能不一致,因此需要根据POC来重新排列视频帧的显示顺序,以避免跳帧或画面不连贯的问题。具体来说,POC的作用包括:重排显示顺序:POC确保即使在存在B帧的情况下,视频帧......
  • 输入a和b两个整数,按先大后小的顺序输出a和b(用指针变量处理)
    解题思路:        定义两个(int*)型指针变量p1和p2,使它们分别指向a和b。使p1指向a和b中的大者,p2指向小者,顺序输出*p1,*p2就实现了按先大后小的顺序输出a和b。编写程序:运行结果:程序分析:        输入a的值45,b的值78,由于a<b,将p1的值和p2的值交换,即将p1的指向......
  • Linux -- 环境变量与文件查找
    提示:制作不易看完点个关注和收藏哦前言提示:要解释环境变量,得先明白变量是什么,准确的说应该是Shell变量,所谓变量就是计算机中用于记录一个值(不一定是数值,也可以是字符或字符串)的符号,而这些符号将用于不同的运算处理中。通常变量与值是一对一的关系,可以通过表达式读取它的......
  • 【C语言进阶】--- 动态内存管理
    动态内存管理函数1.malloc函数void*malloc(size_tsize);功能:向堆区的空间中申请一块大小为size个字节的空间,返回指向这块空间的指针如果开辟失败会返回一个NULL指针,因此要检查malloc的返回值,避免返回NULL指针后再访问空指针malloc申请的空间,程序退出后会还给操作系统......
  • 《Linux内核完全注释》学习笔记:2.5 Linux内核对内存的使用方法
    在Linux0.11内核中,为了有效地使用机器中的物理内存,内存被划分成几个功能区域,如图2-9所示。图2-9物理内存使用的功能区域分布图Linux内核程序占据在物理内存的开始部分,接下来是用于供硬盘或软盘等块设备使用的高速缓冲区部分。当一个进程需要读取块设备中的数据时,系统会......
  • Shell阶段10 awk工作原理, 内部变量, 正则/比较/条件/逻辑表达式, 判断语句, 循环语
    AWK什么是awkawk是一个编程语言主要作用:对文本和数据的处理awk处理数据的流程1.扫描文件内容,从上到下进行扫描,按照行进行处理2.寻找匹配到的内容,进行读取到特定的模式中,进行行处理3.行满足指定模式动作,则输出到屏幕上面,不满足丢弃4.接着读取下一行继续处理,接着循环,直......
  • JVM(Java虚拟机)、JMM(Java内存模型)笔记
    面试常见:请你谈谈你对JVM的理解?java8虚拟机和之前的变化更新?什么是OOM,什么是栈溢出StackOverFlowError?怎么分析?JVM的常用调优参数有哪些?内存快照如何抓取?怎么分析Dump文件?谈谈JVM中,类加载器你的认识?请你谈谈你对JVM的理解?JVM(Java虚拟机)是Java程序的运行环境,它允......
  • ProcDump工具的基本用法和功能,并掌握如何利用它进行进程监视、性能分析和故障排查,从而
    ProcDump初级应用的大纲:1.ProcDump简介与基本用法介绍ProcDump工具的基本作用和功能。演示如何使用ProcDump来监视进程并在满足指定条件时生成转储文件。2.进程监视与性能分析探讨如何使用ProcDump监视进程的CPU利用率、内存占用等性能指标。演示如何利用ProcDump生成......
  • VMMap工具的基本功能和使用方法,包括如何分析内存分配情况、监控内存使用模式等;包括深
    VMMap初级应用的大纲:1.介绍VMMap简要介绍VMMap是什么,以及其在Windows系统中的作用和用途。解释VMMap能够提供的信息类型,如内存分配情况、内存使用模式等。2.VMMap的基本功能演示如何使用VMMap打开目标进程,并查看其内存映射和分配情况。介绍VMMap提供的基本过滤器和查看......
  • 成为MySQL DBA后,再看ORACLE数据库(五、内存管理)
    一、前言在数据库的体系结构中,内存区是非常关键的一部分,一般而言数据库实例也是由内存+后台进程组成。不同于MySQL的单进程多线程架构,ORACLE是多进程架构,所以在内存管理上也更加复杂。ORACLE的内存管理一般分两部分:PGA(ProgramGlobalArea)和SGA(SystemGlobalArea)。翻开当年学习O......