注册网络公司起什么名字,手机优化专家下载,wordpress页脚设置,实体店线上线下运营模式文章目录 前言柔性数组1.1 概念1.2 柔性数组的特点1.3 柔性数组的使用1.4 柔性数组的优势 总结 前言
说到柔性数组#xff0c;相信有很多学过C语言的读者都不知道这是个什么东西。不过没有关系#xff0c;相信本章能够带你从到认识到掌握柔性数组#xff0c;做一个充满知识… 文章目录 前言柔性数组1.1 概念1.2 柔性数组的特点1.3 柔性数组的使用1.4 柔性数组的优势 总结 前言
说到柔性数组相信有很多学过C语言的读者都不知道这是个什么东西。不过没有关系相信本章能够带你从到认识到掌握柔性数组做一个充满知识的man/woman。
在此处我先透露一下本次的知识点需要结合结构体和动态内存开辟的知识点。如果对这两个知识点不是很熟悉的读者可以翻阅我之前写过的文章。
那么话不多说就让我们开启柔性数组的学习之旅吧
柔性数组
也许你从来没有听过柔性数组这个概念但是它确实是真实存在的。
1.1 概念
在C99中结构体中最后一个成员允许使用未知大小的数组这个就叫做柔性数组成员。 例如
struct st_type
{int i;int arr[0];//柔性数组成员
};上述代码可能有的编译器会报错导致程序无法正常执行可以改成以下代码
struct st_type
{int i;int arr[];//柔性数组成员
};看到这里你心中可能会用这样一个疑问柔性数组有什么优势或者特点呢值得我去学习。那么接下来我们就来聊一聊柔性数组的特点。
1.2 柔性数组的特点
结构体中柔性数组成员前面至少有一个其他成员sizeof返回这种结构体的大小时是不包含柔性数组的大小包含柔性数组成员的结构体用malloc函数进行内存的动态分配并且分配的内存应该大于结构体的大小以适应柔性数组的预期大小 这里解释一下特点1和特点2 根据柔性数组的定义你会发现它的数组元素个数竟然是0放到正常的场景下这是不可能的这也就从侧面说明了没有人知道它真实的大小当然这是建立在程序员还未决定柔性数组成员的大小的条件下。那竟然不知道它真实的大小如果整个结构体有且仅有这么一个成员的话那么连同这个结构体大小也是未知的了故此我们做出了一种方案在一个包含着柔性数组的结构体中其前面必须至少得存在一个算得出来大小的成员。这样我们就在忽略柔性数组大小前提下可以得出该结构体大小。另外sizeof在计算这种结构体时不包含柔性数组成员的大小也是出于这方面的考虑。 例子
#includestdio.h
struct test
{char c;int arr[];//柔性数组成员其前面有一个已知大小的成员
};int main()
{printf(%zd\n,sizeof(struct test));//这里输出的是1return 0;
}1.3 柔性数组的使用
代码1
#includestdio.h
#includestdlib.h
typedef struct st_type
{int i;int arr[];
}type_a;int main()
{//因为我们需要对柔性数组成员的大小进行提前设定type* pa (type_a*)malloc(sizeof(type_a)100*sizeof(int));if(pa NULL){perror(malloc);return 1;}//业务处理pa-i 100;for(int i 0; i100; i){pa-arr[i] i 1;}free(pa);pa NULL;return 0;
}
这样柔性数组成员arr相当于获得了100个整型元素的连续空间。
相信看到这里的读者已经感受到了柔性数组的魅力了。其能够克服普通数组无法改变其自身大小的缺点能灵活变化自身元素的个数。
1.4 柔性数组的优势
可能有的读者突发奇想你这个功能我不用柔性数组也能实现啊。 代码展示
#includestdio.h
#includestdlib.htypedef struct st_type
{int i;int* arr;
}type_a;int main()
{type_a* pa (type_a*)malloc(sizeof(type_a));pa-i 100;pa-arr (int*)malloc(sizeof(int)*(p-i));//业务处理for(int i 0; i pa-i; i){pa-arr[i] i 1;}//释放空间free(pa-arr); free(pa);pa-arr NULL;pa NULL;return 0;
}
上述代码可以同样完成任务但是第一种写法有两种好处 第一个好处是方便内存释放 如果我们代码是在一个给别人用的函数中你在里面做了两次内存分配并把整个结构体返回给用户。用户调用free可以释放结构体的内存但是用户并不知道这个结构体内成员也需要进行free所以你不能指望用户来发现这件事。所以如果我们把结构体的内存以及其成员要的内存一次性分配好的话并返回给用户一个指针用户就可以根据这个给指针正确的找到并且使用动态开辟的空间之后再只需使用一次free就可以把所有的内存给释放掉了。 第二个好处是有利于内存的访问速度 连续的内存有益于访问速度的提升也有利于减少内存碎片。其实我个人感觉也没有提升多少反正你跑不了要用做偏移量做加法来寻址 总结
好了到这里我们就把柔性数组的知识点全部讲完了也相信大家对柔性数组有一定的认识了。所谓的柔性数组就像是一块具有柔性的布料可以在一定的环境下随意改变它的长度使其符合我们的预期达到我们想要的效果。