前言:柔性数组是C99中新添加的概念,它是结构体里面的最后一个成员,因为它的大小未知,所以很灵活,称之为柔
1 柔性数组占不占结构体的空间呢?
不占
typedef struct Stu
{char y;int x;int arr[];//有些编译器不支持这样写,可以写成int arr[0],这个就是柔性数组
}St;
int main()
{//这里我们可以计算一下柔性数组到底计不计算空间printf("%d", sizeof(St));//这里涉及结构体的位段后面再说return 0;
}
我们看到结构体的大小是8,所以柔性数组是不占空间的
2 柔性数组怎么用
用动态内存开辟的方式用,我们来结合昨天的动态内存管理设计一下程序
typedef struct Stu
{char y;int x;int arr[];//有些编译器不支持这样写,可以写成int arr[0],这个就是柔性数组
}St;
int main()
{//这里我们可以计算一下柔性数组到底计不计算空间printf("%d\n", sizeof(St));//这里涉及结构体的位段后面再说St s = { 0 };St* p = NULL;p = &s;p = (St*)malloc(sizeof(int) * 10+sizeof(St));if (p == NULL)return 0;for (int i = 0; i < 10; i++){p->arr[i] = i;printf("%d ", p->arr[i]);}//如果后面要多开辟空间的话p = (St*)realloc(p,sizeof(int) * 15 + sizeof(St));for (int i = 10; i < 15; i++){p->arr[i] = i;printf("%d ", p->arr[i]);}free(p);p = NULL;return 0;
}
3 柔性数组的一种模拟实现(有缺陷,总的来说还是柔性数组好用)
因为柔性数组只需要释放一次堆区内存,并且柔性数组不占用结构体内存
typedef struct Stu
{char y;int x;int* arr;
}St;int main()
{printf("%d\n", sizeof(St));//指针占用内存空间//先给结构体开辟空间St* p = (St*)malloc(sizeof(St));//然后指针指向的空间开辟p->arr = (int*)malloc(sizeof(int) * 10);//判断是否为空if (p == NULL || p->arr == NULL)return 1;//不为空继续下面的程序p->x = 1;p->y = 'w';for (int i = 0; i < 10; i++){p->arr[i] = i;printf("%d ", p->arr[i]);}//用完后记得释放内存,先释放小的,再释放大的//如果你先释放大的话,那么指针arr没有了,怎么找arr指向的那块空间呢?free(p->arr);free(p);//然后置空p->arr = NULL;p = NULL;return 0;
}