当前位置:   article > 正文

(c语言进阶)柔性数组_柔性数组 内存对齐

柔性数组 内存对齐

目录

柔性数组 

一.柔性数组的特点​编辑

1.结构中的柔性数组成员前面必须有至少一个其他成员 

2.sizeof返回的这种结构体大小不包括柔性数组的内存——也会内存对齐 

3.包含柔性数组成员的结构体用malloc函数进行内存的动态分配,并且分配的内存应该大于结构体的大小,以适应柔性数组的预期大小

二.其他方法实现柔性数组的效果——不建议用

三.柔性数组的优势


柔性数组 

一.柔性数组的特点

1.结构中的柔性数组成员前面必须有至少一个其他成员 

2.sizeof返回的这种结构体大小不包括柔性数组的内存——也会内存对齐 

  1. #include <stdio.h>
  2. struct st_type
  3. {
  4. char n;
  5. int i;
  6. int a[0];
  7. };
  8. int main()
  9. {
  10. printf("%zu",sizeof(struct st_type));
  11. return 0;
  12. }

3.包含柔性数组成员的结构体用malloc函数进行内存的动态分配,并且分配的内存应该大于结构体的大小,以适应柔性数组的预期大小

  1. #include <stdio.h>
  2. #include<stdlib.h>
  3. typedef struct st
  4. {
  5. char n;
  6. int i;
  7. int arr[0];
  8. }st;
  9. int main()
  10. {
  11. int i;
  12. //初始化
  13. st* p = (st*)malloc(sizeof(st)+sizeof(int)*10);
  14. if (p == NULL)
  15. {
  16. perror("malloc");
  17. return 1;
  18. }
  19. p->n = 'w';
  20. p->i = 4;
  21. //输入
  22. for (i = 0; i < 10; i++)
  23. {
  24. p->arr[i] = i;
  25. }
  26. //输出
  27. printf("增加内存空间前:");
  28. for (i = 0; i < 10; i++)
  29. {
  30. printf("%d ",p->arr[i]);
  31. }
  32. printf("%c %d",p->n,p->i);
  33. printf("\n");
  34. //数组空间不够,增加内存
  35. st* str = (st*)realloc(p,sizeof(st) + sizeof(int)*15);
  36. if (str == NULL)
  37. {
  38. perror("realloc");
  39. return 1;
  40. }
  41. //继续使用
  42. //输入
  43. for (i = 10; i < 15; i++)
  44. {
  45. p->arr[i] = i;
  46. }
  47. //输出
  48. printf("增加内存空间后:");
  49. for (i = 0; i < 15; i++)
  50. {
  51. printf("%d ", p->arr[i]);
  52. }
  53. printf("%c %d", p->n, p->i);
  54. free(p);
  55. p = NULL;
  56. return 0;
  57. }

二.其他方法实现柔性数组的效果——不建议用

  1. #include <stdio.h>
  2. #include<stdlib.h>
  3. typedef struct st
  4. {
  5. char n;
  6. int i;
  7. int* arr;
  8. }st;
  9. int main()
  10. {
  11. //在堆区申请结构体
  12. st* p = (st*)malloc(sizeof(st));
  13. if (p == NULL)
  14. {
  15. perror("malloc");
  16. return 1;
  17. }
  18. //堆区申请数组内存
  19. p->arr = (int*)malloc(sizeof(int)*10);
  20. if (p->arr == NULL)
  21. {
  22. perror("malloc");
  23. return 1;
  24. }
  25. //初始化
  26. int i;
  27. for (i = 0; i < 10; i++)
  28. {
  29. p->arr[i] = i;
  30. }
  31. //内存空间不够
  32. int* ps = (int*)realloc(p->arr,sizeof(int)*15);
  33. if (ps == NULL)
  34. {
  35. perror("realloc");
  36. return 1;
  37. }
  38. p->arr = ps;
  39. for (i = 10; i < 15; i++)
  40. {
  41. p->arr[i] = i;
  42. }
  43. for (i = 0; i < 15; i++)
  44. {
  45. printf("%d ",p->arr[i]);
  46. }
  47. //释放堆区上的数组内存
  48. free(p->arr);
  49. p->arr = NULL;
  50. //释放堆区上的结构体内存
  51. free(p);
  52. p = NULL;
  53. return 0;
  54. }

三.柔性数组的优势

 

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

闽ICP备14008679号