一文掌握C语言中的柔性数组
投稿:mrr
柔性数组在C语言的 C99 标准中,引入的新特性,结构中的最后一个元素的大小允许是未知的数组,即为柔性数组,本文给大家介绍c语言中的柔性数组,感兴趣的朋友跟随小编一起看看吧
何为柔性数组(Flexible Array)
柔性数组在C语言的 C99 标准中,引入的新特性。结构中的最后一个元素的大小允许是未知的数组,即为柔性数组。
struct S { int i; int arr[]; //柔性数组成员 /*int arr[0];*/ //这两种写法都可以,具体看编译器 };
1.柔性数组的特点
- 柔性数组不能单独的出现在结构体之中,至少要包含一个及以上其它成员,且要在末尾
- 利用sizeof计算的结构体大小,并不会去计算柔性数组的大小
- 包含柔性数组成员的结构体要利用malloc来进行动态内存分配,且分配的内存大小要大于结构体内存大小,来达到预期的所需内存的大小。
2.柔性数组的创建和简单使用
创建
struct S { int i; int arr[]; }; int main() { struct S *s = (struct S*)malloc(sizeof(struct S)+5*sizeof(int)); //使用malloc创建了一个大小为: (结构体本身大小) + 柔性数组你所期望的大小 struct S *s = (struct S*)malloc(sizeof(struct S)+10*sizeof(int)); //调整柔性数组大小 return 0; }
这就是为什么柔性数组为什么要在成员末尾的原因,只有它在末尾,开辟内存的大小变化时,柔性数组的大小才会随着变化,这就是所谓的柔性数组
简单使用
代码一
struct S { int i; int arr[]; }; int main() { struct S *p = (struct S*)malloc(sizeof(struct S)+5*sizeof(int)); if(p == NULL) return 1; //业务处理 p->i = 100; for (int i = 0; i < 100; i++) { p->arr[i] = i; } //释放空间 free(p); p = NULL; return 0; }
3.柔性数组的优势
在上柔性数组的简单使用中,我们的代码换种写法也可以达到跟柔性数组一样的功能
把柔性数组成员换成:指针变量
代码二
struct S { int i; int *parr; }; int main() { struct S* p = (struct S*)malloc(sizeof(struct S)); if (p == NULL) return 0; p->parr = (int*)malloc(5 * sizeof(int));//多一次malloc就必然要多一次检查和内存释放 if (p->parr == NULL) return 0; //业务处理 p->i = 100; for (int i = 0; i < 100; i++) { p->parr = i; } //释放空间 free(p->parr); //得先释放结构体成员parr所指向的空间 p->parr = NULL; free(p); //在释放p,若顺序弄错造成内存泄露 p->parr = NULL; return 0; }
说白了就是利用结构体里的指针paar再去开辟一块动态内存空间
代码一比代码二优势的地方在于:
优势 1 :方便内存释放
使用了较少次的malloc,这样使后面的内存释放得到了方便,且也不容易造成内存泄漏
优势 2 :提升性能
连续的内存有益于提⾼访问速度,也有益于减少内存碎⽚。
到此这篇关于c语言中的柔性数组的文章就介绍到这了,更多相关c语言柔性数组内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!