带你认识柔性数组

简介: 小编今天又给大家带来新东西了,相信柔性数组这个名词对于大部分人都比较陌生,那接下来就让我们去认识认识这个新朋友

前言

小编今天又给大家带来新东西了,相信柔性数组这个名词对于大部分人都比较陌生,那接下来就让我们去认识认识这个新朋友


1.柔性数组是什么

  C99 中,结构中的最后一个元素允许是未知大小的数组,这就叫做柔性数组成员,可能这个说法对于大家而言比较抽象,那下面请看具体实例

typedef struct s
  {
  int a;
  int arr[];//柔性数组成员
  }type;
 可能大家还见过另外版本的柔性数组,如
typedef struct s
  {
  int a;
  int arr[0];//柔性数组成员
  }type;

 这里的0和不写表示的意思是一样的,指的是数组大小是未知的,但对于第二个版本可能有些编译器存在着无法编译的问题。

2.柔性数组的特点

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


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


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


这里第二点我需要给大家验证一下:

#include <stdio.h>
int main()
{
  typedef struct s
  {
  int a;
  int arr[];//柔性数组成员
  }type;
  printf("%d", sizeof(type));
}

下面输出结果是:

image.png



这里我们发现该结构在内存只占4个字节,并没有包含该柔性数组


3.柔性数组的使用

对于柔性数组的使用,我们是使用动态内存开辟函数对该进行开辟使用的,接下来大家请看代码


#include <stdio.h>
#include<stdlib.h>
int main()
{
  typedef struct s
  {
  int a;
  int arr[];//柔性数组成员
  }type;
  type* pa = (type*)malloc(sizeof(type) * 100);//这里对于该数组的空间就开辟好了
  int i = 0;
  for (i = 0; i < 100; i++)
  {
  pa->arr[i] = i;
  }
  for (i = 0; i < 100; i++)
  {
  printf("%d ", pa->arr[i]);
  }
  free(pa);
  pa = NULL;
}


结果展示:

image.png



对于该内存的开辟,我浅显的给大家画一幅图展示一下


image.png


4.柔性数组的优势

这里大家可能会说我使用动态内存开辟也能达到此类效果,那对于柔性数组的使用,优势又在何处呢?


第一个好处是: 方便内存释放

如果我们的代码是在一个给别人用的函数中,你在里面做了二次内存分配,并把整个结构体返回给

用户。用户调用 free 可以释放结构体,但是用户并不知道这个结构体内的成员也需要 free ,所以你

不能指望用户来发现这个事。所以,如果我们把结构体的内存以及其成员要的内存一次性分配好

了,并返回给用户一个结构体指针,用户做一次 free 就可以把所有的内存也给释放掉。

第二个好处是: 这样有利于访问速度 .

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


相关文章
|
7月前
|
编译器 C语言
柔性数组理解
柔性数组理解
50 0
|
编译器 C语言 Python
柔性数组
柔性数组
48 0
指针数组与数组指针
实质: 一个是数组,一个是指针. 区别: 指针数组(存放指针的数组):本质上是数组,每个元素都是指针. char* arr[10]; int* arr[10]; 数组指针(指向数组的指针):本质上是指针,每个元素是int类型(就下面例子而言)
40 0
|
存储 C语言 C++
深入了解指针,指针数组,数组指针。
深入了解指针,指针数组,数组指针。
|
编译器 C语言 C++
动态内存分配(3)——柔性数组
动态内存分配(3)——柔性数组
|
存储 C++
指针数组和数组指针
指针数组其实就是存放指针的数组,数组中的每一个元素都指向一个地址。int* (类型名) p(变量名)[数组大小];//整形指针的数组//一级字符指针的数组//二级字符指针的数组在我们定义指针的时候,我们都是在变量名前面加上一个 * 号,数组指针也是类似的定义模式。int main(){//定义一个指向长度位10的整型数组的指针//解释:p先和*结合,说明p是一个指针变量,然后指着指向的是一个大小为10个整型的数组。所以p是一个//指针,指向一个数组,叫数组指针。
|
7月前
|
编译器
关于柔性数组
关于柔性数组
|
存储 算法 程序员
【C/C++】动态内存&柔性数组
【C/C++】动态内存&柔性数组
133 0
|
编译器 C语言
认识柔性数组
认识柔性数组
|
7月前
|
编译器 C语言