前言
也许你从来没有听说过柔性数组(flexible array)这个概念,但是它确实是存在的。C99中,结构中的最后⼀个元素允许是未知⼤⼩的数组,这就叫做『柔性数组』成员。
创造不易,可以点点赞吗~
如有错误,欢迎指出~
目录
如下代码int a[0]就是柔性数组
- struct st_type
- {
- int i;//柔性数组前面至少要有一个其他成员
- int a[0];//柔性数组成员
- //int a[];
- };
- struct st
- {
- int a;
- int arr[];
- };
-
- int main()
- {//用结构体指针变量ps接收malloc函数分配空间的地址
- struct st*ps=(struct st*)malloc(sizeof(struct st) + 10 * sizeof(int));
- // malloc分配空间的大小是 结构体大小+40字节 (40字节是分配给柔性数组的)
- //判断
- if (ps == NULL)
- {
- return 1;
- }
- //使用
- ps->a = 100;
- for (int i = 0; i < 10; i++)
- {
- ps->arr[i] = i;
- }
- //若数组空间不够
- //用realloc函数重新分配
- struct st*ptr=(struct st*)realloc(ps,sizeof(struct st) + 15 * sizeof(int));
- if (ptr != NULL)
- {
- ps = ptr;//再次赋值给ps
- }
- else
- {
- perror("realloc");
- }
- //继续使用
- for (int i = 0; i < 15; i++)
- {
- ps->arr[i] = i;
- }
- //打印
- for (int i = 0; i < 15; i++)
- {
- printf("%d ",ps->arr[i]);
- }
- //释放
- free(ps);
- ps = NULL;
- return 0;
- }
不使用柔性数组实现同样功能,就要多次使用malloc函数开辟空间
- #include <stdio.h>
- #include<stdlib.h>
- struct st
- {
- int a;
- int* arr;
- };
- int main()
- {//用结构体指针变量ps接收malloc函数分配空间的地址
- struct st* ps = (struct st*)malloc(sizeof(struct st));
- //判断
- if (ps == NULL)
- {
- return 1;
- }
- //使用
- ps->a = 100;
- //再次使用malloc函数给数组arr开辟空间
- ps->arr = (int*)malloc(10 * sizeof(int));
- if (ps->arr == NULL)
- {
- perror("malloc-2");
- return 1;
- }
- //使用
- for (int i = 0; i < 10; i++)
- {
- ps->arr[i] = i;
- }
- //数组空间不够
- // 利用realloc函数扩大
- int* ptr = (int*)realloc(ps->arr, 15 * sizeof(int));
- if (ptr == NULL)
- {
- perror("realloc");
- return 1;
- }
- else
- {
- ps->arr = ptr;
- }
- //初始化前15个元素
- for (int i = 0; i < 15; i++)
- {
- ps->arr[i] = i;
- }
-
- //打印
- for (int i = 0; i < 15; i++)
- {
- printf("%d ", ps->arr[i]);
- }
- //释放
- free(ps->arr);
- ps->arr = NULL;
- free(ps);
- ps = NULL;
- return 0;
- }