C - 柔性数组

概念

结构体中最后一个元素允许是位置大小的数组,此成员即是柔性数组

例:

struct S
{
    int n;
    int arr[];//未知大小,柔性数组
    //也可写为 int arr[0];
};

使用

#include 
#include 
struct S
{
    int n;
    int arr[0];
};
int main()
{
    struct S* ps = (struct S*)malloc(sizeof(struct S) + 5 * sizeof(int));
    //当一个结构体中有柔性数组时,计算此结构体大小 = 除去柔性数组后的成员大小
    //即:计算柔性数组大小时,大小 = 0
    int i = 0;
    //使用
    for (i = 0; i < 5; i++)
    {
        ps->arr[i] = i;
        printf("%d ", ps->arr[i]);
    }
    //更改动态空间大小
    struct S* pss = (struct S*)realloc(ps, sizeof(struct S) + 5 * sizeof(int));
    if (pss == NULL)
    {
        return 0;
    }
    ps = pss;
    //其他使用……
    free(ps);
    ps = NULL;
}

模拟柔性数组

#include 
#include 
struct S
{
    int n;
    int* arr;
};
int main()
{
    struct S* ps = (struct S*)malloc(sizeof(struct S));
    ps->arr = (int*)malloc(5 * sizeof(int));
    int i = 0;
    for (i = 0; i < 5; i++)
    {
        ps->arr[i] = i;
        printf("%d ", ps->arr[i]);
    }
    int* pss = (int*)realloc(ps->arr, 10 * sizeof(int));
    if (pss == NULL)
    {
        return 0;
    }
    ps->arr = pss;
    free(ps->arr);//释放顺序不能出错
    ps->arr = NULL;
    free(ps);
    ps = NULL;
}

注意点

  • 计算(sizeof)结构体大小时,柔性数组大小不计入计算

  • 柔性数组方便动态内存开辟以及动态内存释放

  • 可以减少内存碎片,提高内存利用率

内存碎片:多次开辟动态空间造成的不可用内存
  • 内存访问效率更高

局部原理:程序在执行时呈现出局部性规律
即在一段时间内,整个程序的执行仅限于程序中的某一部分
  • 结构体中柔性数组成员前必须至少有一个其他成员

  • 包含柔性数组的结构体用malloc开辟空间时,开辟的大小要大于结构体大小

C语言结构体中的数组和指针 - 酷壳

你可能感兴趣的:(C语言学习记录,c语言,学习,开发语言)