目录
一、柔性数组成员
//C99中,结构体中的最后一个元素允许是未知大小的数组,这就叫做柔性数组成员;
typedef struct st_type
{
int i;
int a[];//第一种写法;
//int a[0];//两种写法适应不同编译器,意思一样;
}type_a;
二、柔性数组特点
//1.结构体中的柔性数组成员前,必须至少有一个其他成员;
//2.sizeof返回的含有柔性数组成员的结构体的大小,不包括柔性数组的内存;
//3.包含柔性数组成员的结构用malloc函数进行内存的动态分配,并且分配的内存应该大于结构的大小,以适应柔性数组的预期大小;
typedef struct st_type
{
int i;
int a[];//柔性数组成员;
}type_a;
int main()
{
printf("%d\n", sizeof(type_a));//输出:4;
return 0;
}
三、结构中,柔性数组和指针的对比
1.在结构体中把最后一个成员设置为柔性数组
struct s
{
int n;
int arr[];//柔性数组成员;
};
int main()
{
struct s* ps = (struct s*)malloc(sizeof(struct s) + 40);//使用malloc函数开辟空间,此时开辟的空间大小为 4+40 ;
//注意判断是否成功开辟空间,此处忽略判断NULL;
ps->n = 100;
for (int i = 0; i < 10; i++)//赋值;
{
ps->arr[i] = i;
}
for (int i = 0; i < 10; i++)
{
printf("%d ", ps->arr[i]);
}
struct s* ptr = (struct s*)realloc(ps, sizeof(struct s) + 80);//使用realloc函数调整空间大小,此时将空间调整为 4+80 ;
if (ptr != NULL)//如不为空指针;
{
ps = ptr;//将空间交给p;
ptr = NULL;//ptr不再指向有效空间;
}
//使用完毕;
free(ps);//释放并销毁;
ps = NULL;
return 0;
}
2.在结构体中把最后一个成员设置为指针
struct s
{
int n;
int* arr;
};
int main()
{
struct s* ps = (struct s*)malloc(sizeof(struct s));//使用malloc函数开辟空间,此时开辟的空间大小为 4+4 ,这里面只包含了一个整型数据和一个整型指针的大小;
//注意判断是否成功开辟空间,此处忽略NULL;
ps->n = 100;
ps->arr = (int*)malloc(40);//使用malloc函数开辟空间,此时开辟的空间大小为40,这里只是ps->arr的空间,和结构体s没有关系;
//注意判断是否成功开辟空间,此处忽略;
for (int i = 0; i < 10; i++)//赋值;
{
ps->arr[i] = i;
}
for (int i = 0; i < 10; i++)
{
printf("%d ", ps->arr[i]);
}
int* ptr = (int*)realloc(ps->arr, 80);//使用realloc函数调整空间大小,此时将空间调整为 80 ;
//注意判断是否成功开辟空间,此处忽略
if (ptr != NULL)//如不为空指针;
{
ps = ptr;//将空间交给p;
ptr = NULL;//指针不再指向有效空间;
}
//使用完毕;前面的代码malloc函数使用了两次,此时应该将两个空间都释放;
free(ps->arr); //将指针指向空间中的值销毁;
free(ps); //指针不再指向有效空间;
ps = NULL;
return 0;
}
3.两种方式的对比
//两种方式能达成一样的效果,但是第二种方法不建议使用;
//使用柔性数组的优点和使用指针代替柔性数组的缺点:
//1.使用柔性数组方便内存释放,使用指针代替柔性数组需要使用两次空间开辟函数,需要作多次空间释放销毁,容易忘记或出错;
//2.使用柔性数组有利于访问速度,使用指针代替柔性数组多次开辟空间,容易使内存空间碎片化,降低内存利用率;
(-- end --)