柔性数组
💛💛笔记自取~ :柔性数组笔记💛💛
❤️欢迎喜欢学习
C/C++
的朋友互关一起努力!!
博主目前在学习C语言!!转码道路艰险,需要你们的支持!❤️
1. 什么是柔性数组
✨C99 中,结构体中的
最后一个元素允许是未知大小的数组
,这就叫做『柔性数组』成员✨ 柔性数组成员
前必须至少有一个成员
2. 柔性数组成员的创建
直接用一段代码感受吧💛
struct stu
{
int a;
int b[];//柔性数组成员
};
struct stu
{
int a;
int b[0];//柔性数组成员
//这里b[0]并不是指数组元素为0,而是数组元素不确定
}
所以柔性数组又称0长度数组
以上两种写法都可以,需要根据编译器支持的类型去判断
3. 柔性数组成员特点
🔥🔥柔性数组成员应该注意以下特点:
- sizeof(结构体),计算结构体大小
不包括柔性数组成员
的大小 - 柔性数组成员用malloc或者calloc函数进行合理的内存的动态分配
- 分配的内存应该大于结构体的大小
4. 两种方式创建柔性数组成员
我们给柔性数组成员分配一下动态内存空间
看看
首先数数组外形的
🌟优点:方便释放,
mallco次数少
,不容易出现内存泄漏
struct stu
{
int a;
int b[];//柔性数组成员
};
int main()
{
struct stu* st = (struct stu*)malloc(sizeof(struct stu)
+ 4 * sizeof(int));
//这样就完成了柔性数组内容的分配
//现在的int b[]相当于 int b[4]
if(st == NULL)
{
return -1;
}
else
{
st->a = 0;
int i = 0;
for(i = 0; i < 4; i++)
{
st->b[i] = i;
}
}
//空间不够大,继续申请开辟空间
struct stu* s = (struct stu*)realloc(st, sizeof(struct stu)
+ 8 * sizeof(int));
free(st);
st = NULL;
if(s == NULL)
{
return -1;
}
else
{
int i = 0;
for(i = 0; i < 8; i++)//b[]相当于一个b[8]
{
s->b[i] = i;
}
}
printf("%d", s->b[7]);//打印出来是7
free(s);
s = NULL;//结束释放内存
return 0;
}
🌟🌟看看指针类型的柔性数组成员是如何开辟的
-
疑问:最后一个元素不是数组吗?
为什么是指针?
-
看下面代码的注释,你就知道了
🌟🌟优点:
访问速度快
🌟🌟缺点:melloc过度,会导致
内存碎片
过多,降低空间利用率
struct stu
{
int a;
int* b;//柔性数组成员,指向一个整型的地址,目前还不能算数组
};
int main()
{
struct stu* st = (struct stu*)malloc(sizeof(struct stu));
//先给a分配好地址
if (st == NULL)
{
return -1;
}
else//赋值
{
st->b = (int*)malloc(4 * sizeof(int));
//现在给b分配4个整型大小的空间
//b是空间起始位置地址,b可以看作一个数组的起始地址了,就可以当作是数组名
if (st->b == NULL)
{
return -1;
}
else
{
st->a = 0;
int i = 0;
for (i = 0; i < 4; i++)
{
st->b[i] = i;
}
}
}
printf("%d\n", st->b[3]);//打印3
//空间不够大,继续申请开辟空间
int* s = (int*)realloc(st->b, 8 * sizeof(int));
//空间扩大
if (s == NULL)
{
return -1;
}
else
{
st->b = s;//这样b又是空间起始地址,可以当作数组进行赋值
int i = 0;
for (i = 0; i < 8; i++)
{
st->b[i] = i;
}
}
printf("%d\n", st->b[7]);//打印7
//空间释放
//先释放整个结构体mallco的空间
free(st);
st = NULL;
free(s);
s = NULL;
return 0;
}
❗️❗️❗️中间过程额外要注意
判断动态内存分配所返回的指针是否为空指针
❗️❗️❗️