C语言 柔性数组的使用详解

C语言 柔性数组的使用详解

目录

一.柔性数组的特点

二.柔性数组的使用

1.如何使用柔性数组

2.不用柔性数组的话有什么代替

三.柔性数组的优势

1.方便内存释放

2.提高访问速度

一.柔性数组的特点 struct S { int x; int a[]; }; int main() { printf("%d", sizeof(S)); }

这段代码的输出是什么?

我们打印结构体S所占空间的大小,这个a[]占多少字节呢?

输出结果是4,可一个int类型的x就是4了,a[]去哪了?好奇怪哦。

原来,这是一种柔性数组。

1.结构体中最后一个元素允许是未知大小的数组,这个数组就是柔性数组。

2.结构中的柔性数组前面必须有至少一个其他成员。

3.sizeof返回的这种结构大小不包括柔性数组的内存。

4.包含柔数组成员的结构用malloc函数进行内存的动态分配,且分配的内存应该大于结构的大小,以适应柔性数组的预期大小。

二.柔性数组的使用 1.如何使用柔性数组

包含柔数组成员的结构用malloc函数进行内存的动态分配,

且分配的内存应该大于结构的大小,以适应柔性数组的预期大小。

#define _CRT_SECURE_NO_WARNINGS 1 #include<stdio.h> #include<stdlib.h> struct S { int x; int a[]; }; int main() { //为柔性数组a[]开辟了40个字节的空间 struct S *ps =(struct S*)malloc(sizeof(struct S) + 40); if (ps == NULL) //检查是否为空指针 { perror("ps"); return 1; } ps->x = 10; int i = 0; for (i = 0; i < 10; i++) { ps->a[i] = i; //数组使用 } for (i = 0; i < 10; i++) { printf("%d ",ps->a[i]); //数组打印 } //若觉得40不够用,可用realloc扩容 //如: struct S* ptr = (struct S*)realloc(ps, sizeof(struct S) + 80); if (ptr == NULL) //检查是否为空指针 { perror("realloc"); return 1; } else { ps = ptr; } free(ps); //释放内存并置为空指针 ps = NULL; } 2.不用柔性数组的话有什么代替

我们经常用字符串指针来申请空间,

那我们直接给字符串指针malloc一块空间,不就行了吗,

为什么还要用柔性数组呢?

#define _CRT_SECURE_NO_WARNINGS 1 #include<stdio.h> #include<stdlib.h> struct S { int x; int *a; }; int main() { struct S* ps = (struct S*)malloc(sizeof(struct S) );//为结构体变量x开辟空间 if (ps == NULL) { return 1; } ps->a = (int*)malloc(40);//为字符串指针开辟40个字节的空间 if (ps->a == NULL) { free(ps); ps = NULL; return 1; } free(ps->a); ps->a = NULL; free(ps); ps = NULL; }

上述代码确实可以完成相同的功能,

但是柔性数组相对而言更好。

让我们来看看柔性数组的优势。

三.柔性数组的优势 1.方便内存释放

使用柔性数组我们只用free一次,

而使用字符串指针要free两次,有内存泄漏的风险

2.提高访问速度

柔性数组malloc了一次,是连续的内存,

有益于提高访问速度,减少内存碎片。

到此这篇关于C语言 柔性数组的使用详解的文章就介绍到这了,更多相关C语言 柔性数组内容请搜索易知道(ezd.cc)以前的文章或继续浏览下面的相关文章希望大家以后多多支持易知道(ezd.cc)!

推荐阅读

    电脑输出接音箱|电脑音箱接线

    电脑输出接音箱|电脑音箱接线,,电脑音箱接线把三根的视频线(黄、红、白)按颜色插入电视机的输入,黄色插DVD的视频输出,红白插DVD的左右声道,电

    3500元超额值学生娱乐结构的优化配置

    3500元超额值学生娱乐结构的优化配置,,作为一个DIY的主流用户领域的学生,每个用户51学生攒机的高峰。因为学生用户没有稳定的收入来源,攒机

    探探语言设置|探探怎么设置语言

    探探语言设置|探探怎么设置语言,,1. 探探怎么设置语言打开探探软件,然后就有消息提示的红点,点开就行了!其实这些软件都是挺简单的操作的,都是

    git设置编码|git语言设置

    git设置编码|git语言设置,,git设置编码点击cap4j搜索从git直接链接上拉代码。git语言设置Git是一个开源的分布式版本控制系统,可以有效、高

    论竞技比赛结构中的十种常见误区

    论竞技比赛结构中的十种常见误区,,近年来,在中国电子竞技的发展得到了迅速的发展。虽然网络游戏市场正在进一步扩大,但我们也看到CS和魔兽争

    aes接口的电脑|AES输出

    aes接口的电脑|AES输出,,1. AES输出 斯巴克cayinm-50cd 播放机是斯巴克公司最近设计的一款高档CD机,利用专业升频芯片处理软件,将声频提升

    区域语言设置|区域语言设置工具

    区域语言设置|区域语言设置工具,,区域语言设置工具你好,大致的方法如下,可以参考:1、按下键盘的windows 图标,再开始菜单中单击“设置”;出现的