• 【C语言】还有柔性数组?


    前言

    也许你从来没有听说过柔性数组(flexible array)这个概念,但是它确实是存在的。C99中,结构中的最后⼀个元素允许是未知⼤⼩的数组,这就叫做『柔性数组』成员。

    欢迎关注个人主页逸狼


    创造不易,可以点点赞吗~

    如有错误,欢迎指出~


    目录

    前言

    柔性数组

    柔性数组的特点

    柔性数组的使用

    不使用柔性数组


    柔性数组

    如下代码int a[0]就是柔性数组

    1. struct st_type
    2. {
    3. int i;//柔性数组前面至少要有一个其他成员
    4. int a[0];//柔性数组成员
    5. //int a[];
    6. };

    柔性数组的特点

    • 结构中的柔性数组成员前⾯必须⾄少⼀个其他成员。
    • sizeof返回的这种结构⼤⼩不包括柔性数组的内存。
    • 包含柔性数组成员的结构⽤malloc()函数进⾏内存的动态分配,并且分配的内存应该⼤于结构的⼤⼩,以适应柔性数组的预期⼤⼩。

    柔性数组的使用

    1. 使用柔性数组,只是用了一次malloc函数,有利于访问速度(相对而言),减少了内存碎片
    2. 把结构体的内存以及其成员要的内存⼀次性分配好,并返回⼀个结构体指针,⼀次free就可以把所有的内存也给释放掉。
    1. struct st
    2. {
    3. int a;
    4. int arr[];
    5. };
    6. int main()
    7. {//用结构体指针变量ps接收malloc函数分配空间的地址
    8. struct st*ps=(struct st*)malloc(sizeof(struct st) + 10 * sizeof(int));
    9. // malloc分配空间的大小是 结构体大小+40字节 (40字节是分配给柔性数组的)
    10. //判断
    11. if (ps == NULL)
    12. {
    13. return 1;
    14. }
    15. //使用
    16. ps->a = 100;
    17. for (int i = 0; i < 10; i++)
    18. {
    19. ps->arr[i] = i;
    20. }
    21. //若数组空间不够
    22. //用realloc函数重新分配
    23. struct st*ptr=(struct st*)realloc(ps,sizeof(struct st) + 15 * sizeof(int));
    24. if (ptr != NULL)
    25. {
    26. ps = ptr;//再次赋值给ps
    27. }
    28. else
    29. {
    30. perror("realloc");
    31. }
    32. //继续使用
    33. for (int i = 0; i < 15; i++)
    34. {
    35. ps->arr[i] = i;
    36. }
    37. //打印
    38. for (int i = 0; i < 15; i++)
    39. {
    40. printf("%d ",ps->arr[i]);
    41. }
    42. //释放
    43. free(ps);
    44. ps = NULL;
    45. return 0;
    46. }

    对比 不使用柔性数组

    不使用柔性数组实现同样功能,就要多次使用malloc函数开辟空间

    1. #include <stdio.h>
    2. #include<stdlib.h>
    3. struct st
    4. {
    5. int a;
    6. int* arr;
    7. };
    8. int main()
    9. {//用结构体指针变量ps接收malloc函数分配空间的地址
    10. struct st* ps = (struct st*)malloc(sizeof(struct st));
    11. //判断
    12. if (ps == NULL)
    13. {
    14. return 1;
    15. }
    16. //使用
    17. ps->a = 100;
    18. //再次使用malloc函数给数组arr开辟空间
    19. ps->arr = (int*)malloc(10 * sizeof(int));
    20. if (ps->arr == NULL)
    21. {
    22. perror("malloc-2");
    23. return 1;
    24. }
    25. //使用
    26. for (int i = 0; i < 10; i++)
    27. {
    28. ps->arr[i] = i;
    29. }
    30. //数组空间不够
    31. // 利用realloc函数扩大
    32. int* ptr = (int*)realloc(ps->arr, 15 * sizeof(int));
    33. if (ptr == NULL)
    34. {
    35. perror("realloc");
    36. return 1;
    37. }
    38. else
    39. {
    40. ps->arr = ptr;
    41. }
    42. //初始化前15个元素
    43. for (int i = 0; i < 15; i++)
    44. {
    45. ps->arr[i] = i;
    46. }
    47. //打印
    48. for (int i = 0; i < 15; i++)
    49. {
    50. printf("%d ", ps->arr[i]);
    51. }
    52. //释放
    53. free(ps->arr);
    54. ps->arr = NULL;
    55. free(ps);
    56. ps = NULL;
    57. return 0;
    58. }

  • 相关阅读:
    产品说明丨如何使用MobPush快速创建应用
    算法——快乐数
    Nginx SSL证书更新及密码套件更新
    学习c语言第24天(练习)
    C++学习 --queue
    PG系列数据库TPCH测试文档
    【python练习】python斐波那契数列超时问题
    HTML导航栏二级菜单(垂直、水平方向)
    npm 包管理
    kafka rebalance你真的了解吗
  • 原文地址:https://blog.csdn.net/2301_80898480/article/details/136406988