1.什么是柔性数组
在C99中,结构中最后一个元素允许是未知大小的数组,这就叫做柔性数组成员
例如:
typedef struct S
{
int i;
int arr[];//柔性数组成员
}S;
或者
typedef struct S
{
int i;
int arr[0];//柔性数组成员
}S;
2.柔性数组的特点:
• 结构中的柔性数组成员前面必须至少一个其他成员
• sizeof返回的这种结构大小不包括柔性数组的内存
#include<stdio.h>
typedef struct S
{
int i;
int arr[0];//柔性数组
}S;
int main()
{
printf("%d\n", sizeof(S));
return 0;
}
• 包含柔性数组成员的结构用malloc()函数进行内存的动态分配,并且分配的内存应该大于结构的大小,以适应柔性数组的预期大小
3.柔性数组的使用
• 代码说明
#include<stdio.h>
#include<stdlib.h>
typedef struct S
{
int i;
int arr[0];//柔性数组成员
}S;
int main()
{
S* ps = (S*)malloc(sizeof(S) + 5 * sizeof(int));
int i = 100;
for (int i = 0; i < 5; i++)
{
ps->arr[i] = i;
}
S* ptr = realloc(ps, 44);
if (ptr != NULL)
{
ps = ptr;
for (int i = 5; i < 10; i++)
{
ps->arr[i] = i;
}
for (int i = 0; i < 10; i++)
{
printf("%d ", ps->arr[i]);
}
}
free(ps);
ps = NULL;
return 0;
}
• 图解说明
• 运行结果
4.非柔性数组
• 代码说明
#include<stdio.h>
#include<stdlib.h>
typedef struct S
{
int i;
int* arr;
}S;
int main()
{
S* ps = (S*)malloc(sizeof(S));
ps->arr = malloc(5 * sizeof(int));
for (int i = 0; i < 5; i++)
{
ps->arr[i] = i;
}
//调整大小
int* ptr = realloc(ps->arr, 40);
if (ptr != NULL)
{
ps->arr = ptr;
for (int i = 5; i < 10; i++)
{
ps->arr[i] = i;
}
for (int i = 0; i < 10; i++)
{
printf("%d ", ps->arr[i]);
}
}
//释放内存
free(ps->arr);
ps->arr = NULL;
free(ps);
ps = NULL;
return 0;
}
• 图解说明
• 运行结果
5.使用柔性数组的好处
对比如上 3 和 4 可以看出使用柔性数组具有以下优点:
• 方便释放内存
• 有利于访问速度,连续的内存有益于提高访问速度,也有益于减少内存碎片