📜  为结构动态分配内存 (1)

📅  最后修改于: 2023-12-03 14:48:58.162000             🧑  作者: Mango

以'为结构动态分配内存 '作主题

在程序运行时需要对数据进行存储和处理,而通常情况下无法确定数据的具体数量,这时就需要动态地分配内存空间。C语言中提供了动态分配内存的操作,其中一种常用且灵活的方式是使用以“结构体”作为基本单位进行动态内存分配。

结构体的概念

在C语言中,结构体是一个由若干数据类型组成的自定义复合数据类型,其中每个数据类型称为结构体的成员。结构体的成员可以是基本数据类型(如int、float等),也可以是其他自定义的数据类型(如数组、指针等),甚至可以是另一个结构体。

结构体的基本语法如下:

struct 结构体名称 {
    数据类型 成员名称1;
    数据类型 成员名称2;
    数据类型 成员名称3;
    // ...
};

例如,下面的结构体定义了一个学生的基本信息:

struct Student {
    int id;          // 学号
    char name[20];   // 姓名
    int age;         // 年龄
    float score;     // 成绩
};
动态分配内存的概念

C语言中的动态分配内存是指在程序运行时通过代码动态申请指定大小的内存空间,当使用完毕后再通过代码释放对应的内存空间。动态分配内存可以方便地实现不确定数据量的数据存储和处理,同时也可以提高内存使用效率。

动态分配内存涉及到以下三个函数:

  1. malloc:用于申请指定大小的内存空间,并返回指向该内存空间的起始地址。
  2. realloc:用于扩展或缩小已经申请的内存空间的大小,并返回指向新的内存空间的起始地址。
  3. free:用于释放已经申请的内存空间。

这三个函数都在标准库的头文件stdlib.h中声明。

结构体动态分配内存的方法

下面介绍一种常用的方法:先申请存储结构体指针的空间,再申请存储结构体成员的空间。具体步骤如下:

  1. 定义一个指向结构体的指针变量,如下所示:

    struct Student *stuPtr;
    
  2. 通过malloc函数申请存储指针的空间,并将返回的指针赋值给stuPtr,如下所示:

    stuPtr = (struct Student*)malloc(sizeof(struct Student));
    

    此时,stuPtr指向的空间大小为一个结构体的大小。

  3. 通过访问结构体指针的方式,给结构体成员赋值,如下所示:

    stuPtr->id = 1001;
    strcpy(stuPtr->name, "张三");
    stuPtr->age = 18;
    stuPtr->score = 92.5;
    
  4. 通过malloc函数再申请存储结构体成员的空间,如下所示:

    stuPtr->name = (char*)malloc(20 * sizeof(char));
    

    此时,stuPtr->name指向的空间大小为20个字符的大小。注意,对于动态分配的字符数组,需要用strcpy函数进行赋值。

  5. 最后,用free函数释放申请的内存空间,如下所示:

    free(stuPtr);
    

完整的代码如下所示:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

struct Student {
    int id;          // 学号
    char *name;      // 姓名
    int age;         // 年龄
    float score;     // 成绩
};

int main() {
    struct Student *stuPtr;                  // 定义结构体指针变量
    stuPtr = (struct Student*)malloc(sizeof(struct Student));  // 申请存储指针的空间
    stuPtr->name = (char*)malloc(20 * sizeof(char));            // 申请存储字符数组的空间

    stuPtr->id = 1001;                       // 赋值结构体成员
    strcpy(stuPtr->name, "张三");
    stuPtr->age = 18;
    stuPtr->score = 92.5;

    printf("学号:%d\n姓名:%s\n年龄:%d\n成绩:%f\n", stuPtr->id, stuPtr->name, stuPtr->age, stuPtr->score);

    free(stuPtr->name);                      // 释放字符数组所占用的空间
    free(stuPtr);                            // 释放指针所占用的空间
    return 0;
}
总结

使用以“结构体”为基本单位进行动态内存分配,可以方便地实现不确定数据量的数据存储和处理。动态分配内存涉及到三个函数:malloc、realloc和free。在分配内存时,先申请存储指针的空间,再申请存储结构体成员的空间。使用完毕后,需要释放空间,防止内存泄漏。