带你认识柔性数组

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

前言

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


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 就可以把所有的内存也给释放掉。

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

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


相关文章
|
5天前
|
编译器 C语言
柔性数组理解
柔性数组理解
24 0
|
6月前
|
编译器 C语言 Python
柔性数组
柔性数组
23 0
|
7月前
|
程序员 C语言 C++
动态内存管理与柔性数组2
动态内存管理与柔性数组
27 0
|
5天前
|
编译器 C语言
C语言中柔性数组的讲解与柔性数组的优势
C语言中柔性数组的讲解与柔性数组的优势
|
5天前
|
编译器
关于柔性数组
关于柔性数组
|
9月前
|
编译器 C语言 C++
动态内存分配(3)——柔性数组
动态内存分配(3)——柔性数组
|
5天前
|
编译器 C语言
|
6月前
|
编译器 C语言
认识柔性数组
认识柔性数组
|
存储 算法 程序员
【C/C++】动态内存&柔性数组
【C/C++】动态内存&柔性数组
65 0
|
8月前
动态内存管理之柔性数组
动态内存管理之柔性数组
动态内存管理之柔性数组