当前位置:   article > 正文

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

【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. }

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/2023面试高手/article/detail/237524
推荐阅读
相关标签
  

闽ICP备14008679号