网站建站的尺寸,如何还原wordpress,文学写作网站,灵山网站建设文章目录 1. 柔性数组的定义2. 柔性数组的特点3. 柔性数组的使用4. 柔性数组的好处 也许你从来没有听说过
柔性数组这个概念#xff0c;但是它确实是存在的。柔性数组是C语言中一种特殊的结构#xff0c;它允许在结构体的末尾定义一个可变长度的数组。 1. 柔性数组的定义
柔… 文章目录 1. 柔性数组的定义2. 柔性数组的特点3. 柔性数组的使用4. 柔性数组的好处 也许你从来没有听说过
柔性数组这个概念但是它确实是存在的。柔性数组是C语言中一种特殊的结构它允许在结构体的末尾定义一个可变长度的数组。 1. 柔性数组的定义
柔性数组是在C99中的一种玩法它有两种定义方式当其中一种定义方式编译器编译不通过的时候可以换另一种方式。 方式一
typedef struct st_type
{int i;int a[0];//柔性数组成员
}type_a;方式二
typedef struct st_type
{int i;int a[];//C99的玩法是int a[]; 没有指定数组长度
}type_a;2. 柔性数组的特点
结构中的柔性数组成员前面必须至少一个其他成员。 这是因为柔性数组的大小是不确定的所以编译器需要知道其他成员的大小和偏移量。 sizeof 返回的这种结构大小不包括柔性数组的内存。 这是因为柔性数组的大小是可变的因此 sizeof 返回的是结构体的固定部分的大小。 包含柔性数组成员的结构用malloc ()函数进行内存的动态分配并且分配的内存应该大于结构的大小以适应柔性数组的预期大小。
struct S
{int a;char data[]; // 柔性数组成员
};struct S* str malloc(sizeof(struct S) 20); // 20是柔性数组的最大长度 3. 柔性数组的使用
以下代码演示了柔性数组的用法
#include stdio.h
#include stdlib.hstruct S
{int n;int data[]; // 柔性数组成员
};int main() {// 创建包含柔性数组的结构体并分配足够大的内存struct S* s malloc(sizeof(struct S) 20); // 20是柔性数组的最大长度if (s NULL){perror(malloc);return 1;}s-n 10;for (int i 0; i 5; i){(s-data)[i] i;}for (int i 0; i 5; i){printf(%d , (s-data)[i]);}free(s); // 释放内存s NULL;return 0;
}上面这段代码的意思是我想分配一个不定长的数组于是我有一个结构体其中有两个成员一个是n一个是data。其实上述结构也可以通过指针运算和动态内存分配来实现。关于动态内存分配的知识可以参考之前写的一篇文章动态内存管理malloc calloc realloc free— C语言
#include stdlib.h
#include string.h// 定义结构体包含柔性数组
struct S
{int len; // 柔性数组的长度int* data; // 柔性数组成员
};int main()
{// 定义结构体指针struct S* s (struct S*)malloc(sizeof(struct S));s-len 5;// 给柔性数组的部分分配内存s-data (int*)malloc(5 * sizeof(int)); // 假设柔性数组存储5个整数// 初始化柔性数组for (int i 0; i s-len; i) {s-data[i] i;}// 访问柔性数组的元素printf(柔性数组的内容: );for (int i 0; i s-len; i) {printf(%d , s-data[i]);}printf(\n);// 释放内存free(s);s NULL;return 0;
}看到这里你会说把data声明成一个指针然后为它再分配一下内存好像也可以也能完成我们预期的效果那为什么还要搞出来一个0长数组呢有啥意义呢答案很简单就是搞出来柔性数组其实就是我们想给一个结构体内的数据分配一个连续的内存
4. 柔性数组的好处
通过上面的介绍我们知道柔性数组的存在就是想给一个结构体内的数据分配一个连续的内存那这样做有什么好处呢 第一个是方便内存释放。 如果我们的代码是在一个给别人用的函数中你在里面做了二次内存分配并把整个结构体返回给用户。用户调用free可以释放结构体但是用户并不知道这个结构体内的成员也需要free所以我们不能指望用户来发现这个事。所以如果我们把结构体的内存以及其成员要的内存一次性分配好了并返回给用户一个结构体指针用户做一次free就可以把所有的内存也给释放掉。 在使用柔性数组的时候空间是一次性开辟好的释放空间的时候只需要释放一次而我们在模拟实现柔性数组的时候是先给结构体开辟了空间然后在结构体内进行了二次内存分配因此在释放空间的时候也需要释放两次然而释放的顺序也是有讲究的要先释放data指向的空间在释放结构体的空间如果顺序反了会导致data指向的空间无法被主动释放会导致内存泄露。 第二个是这样有利于访问速度。 连续的内存有益于提高访问速度也有益于减少内存碎片。其实我个人觉得也没多高了反正你跑不了要用做偏移量的加法来寻址 含柔性数组的结构体在开辟空间的时候是一次性开辟好的在内存中是一片连续的空间。 模拟含柔性数组的结构体在内存中是这样开辟空间的 这种在内存中开辟空间的方式可能会导致内存碎片的问题。内存碎片是指未被使用的小块内存它们可能夹在已分配内存的中间导致内存浪费。 而数据在内存中连续存储时碎片化的可能性较低因为数据被一起分配并存储。
至此本片文章就结束了若本篇内容对您有所帮助请三连点赞关注收藏支持下。 创作不易白嫖不好各位的支持和认可就是我创作的最大动力我们下篇文章见 如果本篇博客有任何错误请批评指教不胜感激