柔性数组知识点

时间:2024-02-23 21:10:35

什么是柔性数组

什么是柔性数组?柔性数组其实也是动态内存管理部分的内容。这节主要来复习柔性数组的知识点。 

当结构体的最后一个成员为数组, 且这个数组的大小未确定时, 我们就称它是柔性数组。

如:

struct stu

{

        char name[20];

        int age;

        char adress[];

}

这里的adress就是一个柔性数组。 (写成char adress[0] 可能报错)

柔性数组的特点 

特点1. 柔性数组成员之前必须有一个其他成员。 

特点2. 进行结构体大小计算时不包含柔性数组成员的大小。如:
 

struct a

{

        int i;

        int a[];

}

 结构体a的大小是4,没有计算a的大小。 

柔性数组的使用

typedef struct a

{

        int i;

        int price[];

}type_a;

int main()

{

        type_a* tmp = (type_a*)malloc(sizeof(type_a) + sizeof(int) * 10); //这里的第一个sizeof是计算                                                                                                                 //的第一个成员i的大小,                                                                                                                     //+后面的计算的是为prince                                                                                                                 //这个柔性数组开辟的空间

        for(int j = 0; j < tmp->i;  j++)

        {

                tmp->price[ j ] = j;        

        }

        free(tmp);

        return 0;

}

柔性数组使用的好处

好处1.

通过上面的使用我们可以发现, 我们使用柔性数组时,是定义一个结构体指针, 然后通过动态内存分配直接申请一块大的内存。 这些内存显然是连续的。 而柔性数组的大小也随着分配确定了下来一起成为一个确定的结构体。 而后续当我们完成使用后, 想要释放空间时, 我们只需要通过那个结构体指针来释放掉这块空间就好。 

但是如果我们不使用柔性数组, 而是把柔性数组改成一个指针呢。我们会怎么做, 为了达成上面的效果, 我们会通过动态内存分配申请一大块内存, 将这块内存给给这个指针。 但是, 这里就有了一个问题,那就是这个指针所指向的内存空间和结构体的内存空间不是连续的(随即开辟, 有可能连续, 但是几率太小)。这样的话, 假如我们通过结构体指针释放结构体内存时, 那个我们为结构体的成员指针开辟的空间就泄露了。 出现问题。 这就是二次分配问题需要注意的地方。 我们要先释放成员指针指向的内存空间。 再释放结构体内存空间。 

用户使用的时候有时候是不知道具体的代码是怎么实现的。 所以柔性数组可以很好的规避二次分配出现的问题。

好处2.使用柔性数组因为空间是连续的, 所以能加快程序运行速度。