成员指针和柔性数组及其优缺点

结构的成员指针:

        当结构的某一项成员数量不固定,我们可以使用 成员数量+指针+堆内存 ,根据实际情况存储成员,例如不同年级的学生成绩数量是不确定的。

使用举例:

typedef struct Student
    {
        int id;
        char name[20];

        int score_cnt;
        float* score;
    }Student;

    // 定义成员,使用栈内存
    Student stu = {1001,"hehe",2};
    stu.score = malloc(sizeof(*stu.score)*stu.score_cnt);
    free(stu.score);

    // 定义成员,使用堆内存
    Student* stup = malloc(sizeof(Student));
    stup->score = malloc(sizeof(*stup->score)*stup->score_cnt);

内存释放:

 free(stup->score);
    free(stup);

注意:不管结构变量如果定义的,必须给成员指针单独分配堆内存,否则成员指针就是野指针,在结构变量使用完毕后还必须单独释放,否则就会产生内存泄漏。

柔性数组:

    当结构的某一项成员数量不固定,可以在结构的末尾定义一个长度为零的数组,这种数组就叫柔性数组,在为结构变量分配内存时多分配一些,多分配的内存就归柔性数组使用。

 typedef struct Student
    {
        int id;
        char name[20];
        int score_cnt;
        float score[]; // 柔性数组
    }Student;

    Student* stup = malloc(sizeof(Student)+sizeof(stup->score[0])*len);
    stup->score = len;

    for(int i=0; i<stup->score_cnt; i++)
    {
        scanf("%f",&stup->score[i]);
    }

    free(stup)

成员指针和柔性数组的优缺点:

 使用成员指针的缺点:

        1、使用麻烦,必须两次分配,两次释放。

        2、危险性高,容易出现野指针、内存泄漏。

        3、结构变量和成员指针所指向的内存是两个独立的内存块,容易产生内存碎片。

        4、成员指针会占用结构的4|8字节空间,再考虑对齐和补齐,浪费的内存更多。

    柔性数组的优点:

        1、使用方便,不需要单独为柔性数组分配内存,只需要为结构变量分配内存时多分配一些即可。

        2、安全性高,柔性数组只是结构中的标误符,因此不会使用到野指针。

        3、柔性数组所使用内存块与结构变量是一体的,与结构变量的内存一起分配一起释放,因此也不容易产生内存泄漏、内存碎片。

        4、节约内存,柔性数组只是结构中的标记符,不会占用结构额外的内存,在计算结构总字节数时,不用柔性数组计算在内。

    柔性数组的缺点:

        这种语法在是C99语法标准中提出并实现的,早期的只支持C89的编译器,不支持此用法,通用性不强。

猜你喜欢

转载自blog.csdn.net/m0_62480610/article/details/125927536
今日推荐