目录
一、柔性数组的定义
柔性数组是一种特殊的数据结构,他在结构体尾部定义一个长度不确定的数组,常用于动态内存分配,可以方便地创建具有可变长度的数据结构
二、柔性数组的特点
1、结构体中的柔性数组成员前面必须至少一个其他成员
2、sizeof返回结构体内存不包括柔性数组的内存
例如:
#include<stdio.h>
struct S
{
int n;
int arr[];//柔性数组成员
};
int main()
{
int sz = sizeof(struct S);
printf("%d\n", sz);
return 0;
}
sz只返回了4个字节,也就是n所占的字节
3、包括柔性数组的结构体用malloc函数进行动态内存分配,并且分配的内存应该大于结构体的内存,以适应柔性数组的预期大小
方案1:
#include<stdio.h>
#include<stdlib.h>
struct S
{
int n;
int arr[];//柔性数组成员
};
int main()
{
//struct S s;只有4个字节
//柔性数组的使用
struct S* ps = (struct S*)malloc(sizeof(struct S) + 40);//44个字节
if (ps == NULL)
{
return 1;
}
ps->n = 100;
int i = 0;
for (i = 0; i < 10; i++)
{
ps->arr[i] = i;
}
for (i = 0; i < 10; i++)
{
printf("%d ", ps->arr[i]);
}
struct S* ptr = (struct S*)realloc(ps, sizeof(struct S) + 80);
if (ptr != NULL)
{
ptr = ps;
}
//释放
free(ps);
ps = NULL;
return 0;
}
用malloc动态内存分配44个字节,malloc返回所分配内存块起始地址,我们需要用结构体类型的指针ps来接收。柔性体现在可以用realloc重新进行动态内存分配,ptr和ps指向的是同一块内存空间,所以在释放时直接释放ps即可
方案2:
#include<stdio.h>
#include<stdlib.h>
struct S
{
int n;
int* arr;
};
int main()
{
struct S* ps = (struct S*)malloc(sizeof(struct S));
if (ps == NULL)
{
return 1;
}
ps->n = 100;
ps->arr = (int*)malloc(40);
if (ps->arr == NULL)
{
return 1;
}
//使用
int i = 0;
for (i = 0; i < 10; i++)
{
ps->arr[i] = i;
}
for (i = 0; i < 10; i++)
{
printf("%d ", ps->arr[i]);
}
//扩容
int* ptr = (int*)realloc(ps->arr, 80);
if (ptr == NULL)
{
return 1;
}
//使用
//.......
//释放
free(ps->arr);
free(ps);
ps = NULL;
return 0;
}
用malloc申请结构体的内存,再用一次申请数组arr的内存,在释放时也要释放结构体和数组的内存,用起来没有方案一便利,方案一是一次申请和一次释放.
三、柔性数组的优势
第一个好处:方便内存释放。申请一次内存,释放一次内存
第二个好处:这样有利于访问速度。但多次使用malloc申请内存会导致内存碎片变多