柔性数组
1.什么是柔性数组
也许你从来没有听说过柔性数组)这个概念,但是它确实是存在的。C99中结构中最后一个元素允许是未知大小的数组,这就叫做柔性数组成员。
2.柔性数组的特点
(1) 柔性数组在定义时前面必须有至少一个其他的成员变量先定义;他不能是第一个;
(2) sizeof操作符计算结构体大小柔性数组不会计算在内;
(3) malloc函数给柔性数组开辟的空间大于结构体的大小,以适应柔性数组的预期大小;
(4) 柔性数组在结构体中只能存在一个;
例子:
typedef struct st_type{
int i;
int a[0];
};//柔性数组成员}type_a;
printf("%d\n",sizeof(type_a));//输出的是4
3.柔性数组的使用
在定义包含柔性数组的结构体变量时不能常规定义struct st s;
这样的定义内存不会给柔性数组分配任何空间;也就无法使用柔性数组;
正确的操作 :
写法一(柔性数组):
柔性数组空间图示:
写法二(非柔性数组):
这里的第一次malloc开辟结构体的空间是为了让我们的数据都在堆去上进行操作;
常规定义结构体变量开辟栈区空间;
这种写法在定义结构体数据类型时定义了一个指针;也可以打到柔性数组的效果
但是对比两种写法我们不难发现第二种使用了两次malloc函数来开辟空间
同时最后也释放了两次空间,显示放了结构体中指针的空间;再释放结构体的空间
第一种则使用一次动态开辟;一次释放空间;
4.总结
malloc使用越多free使用越多,如果没有及时释放空间很容易造成内存泄漏
malloc越多可能让内存碎片增多;这写碎片不能被利用使得我们机器的工作效率降低
所以使用柔性数组的方式更好;
5.好处
如果我们的代码是在一个给别人用的函数中,你在里面做了二次内存分配,并把整个结构体返回给
用户。用户调用free可以释放结构体,但是用户并不知道这个结构体内的成员也需要free,所以
你不能指望用户来发现这个事。所以,如果我们把结构体的内存以及其成员要的内存一次性分配
好了,并返回给用户一个结构体指针,用户做一次free就可以把所有的内存也给释放掉。