【C语言】结构体开辟在堆区

一,介绍

  设计一个结构体指针变量,每个变量保存的是学号(整数),姓名(字符串),分数(浮点数)

二,代码

#include <stdio.h>

#include <string.h>

#include <stdlib.h>

typedef struct stu

{

    int num;

    char *name; // 指针成员,保存的是外部字符串的首元素地址

    float score;

} STU;

void test01()

{

    // 结构体数组在 堆区

    STU *edu = (STU *)calloc(5, sizeof(STU));

    if (NULL == edu)

    {

        return;

    }

    int n = 3;

    // 为数组的每个元素中的 name 申请堆区

    int i = 0;

    for (i = 0; i < n; i++)

    {

        (edu + i)->name = (char *)malloc(32);

        if (NULL == (edu + i)->name)

            return;

    }

    // 获取键盘输入

    for (i = 0; i < n; i++)

    {

        scanf("%d %s %f", &(edu + i)->num, (edu + i)->name, &(edu + i)->score);

    }

    // 输出

    for (i = 0; i < n; i++)

    {

        printf("%d %s %f\n", (edu + i)->num, (edu + i)->name, (edu + i)->score);

    }

    // 释放指针成员 指向的空间

    for (i = 0; i < n; i++)

    {

        if ((edu + i)->name != NULL)

        {

            free((edu + i)->name);

            (edu + i)->name = NULL;

        }

    }

    // 释放结构体数组的空间(堆区)

    if (edu != NULL)

    {

        free(edu);

        edu = NULL;

    }

}

int main(int argc, char const *argv[])

{

    test01();

    return 0;

}

三,输出结果

四,解析

这段代码使用了动态内存分配来创建一个包含学生信息的结构体数组,并通过键盘输入为每个学生的成员赋值。然后,它输出了每个学生的信息,并在最后释放了动态分配的内存。

让我们逐步详细解释这段代码的每个部分:

  1. 定义了一个名为STU的结构体,它包含了学生的学号(num)、姓名(name)和分数(score)。

  2. test01函数中,通过调用calloc函数动态分配了一个包含5个STU结构体的内存块,并将其赋值给指针变量educalloc函数会将分配的内存块初始化为0。

  3. 接下来,代码检查了内存分配是否成功。如果edu指针为NULL,说明内存分配失败,函数使用return语句提前结束函数的执行,并将控制权返回到调用者。

  4. 在循环中,为每个学生的name成员动态分配了32个字节的内存,并将其赋值给相应的指针。

  5. 然后,通过调用scanf函数从键盘输入每个学生的学号、姓名和分数。

  6. 接下来,使用循环遍历结构体数组,并使用printf函数输出每个学生的学号、姓名和分数。

  7. 在最后一个循环中,释放了每个学生的name成员所指向的内存。首先检查name指针是否为NULL,以避免释放无效的内存。如果name指针不为NULL,则使用free函数释放内存,并将name指针设置为NULL

  8. 最后,检查edu指针是否为NULL,以避免释放无效的内存。如果edu指针不为NULL,则使用free函数释放结构体数组所占用的内存,并将edu指针设置为NULL

  9. main函数中,调用了test01函数,并返回0表示程序正常结束。

这段代码的作用是创建一个包含学生信息的结构体数组,并通过键盘输入为每个学生的成员赋值。然后,它输出了每个学生的信息,并在最后释放了动态分配的内存,以避免内存泄漏。

  • 16
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值