前言
c99中,结构体中的最后一个元素是未知大小的数组,这就叫做柔性数组成员。
使用柔性数组会得到一块连续的内存,连续的内存有益于提高访问速度,也有益于减少内存碎片。
柔性数组也需要使用动态内存函数来开辟内存
提示:以下是本篇文章正文内容,下面案例可供参考
1. 柔性数组
方式:
typedef struct st_type
{
int i = ;
int a[0]; 柔性数组成员
}type_a;
报错修改为:
typedef struct st_type
{
int i = ;
int a[]; 柔性数组成员
}type_a;
1.1 柔性数组的特点和使用
- 结构体中柔性数组成员前必须有个其他成员
- sizeof 返回结构体大小不包括柔性数组的内存。
- 包含柔性数组的结构体应该使用动态内存来开辟空间,并且分配的内存应该大于结构体的大小,以适应柔性数组的预期大小。
- 见下方代码
- 这也是柔性数组的使用方法
struct S
{
int a;
int arr[]; //柔性数组成员
};
int main()
{
//给柔性数组成员分配空间
//sizeof计算出结构体大小然后添加40个字节 4+40
struct S* ps = (struct S*)malloc(sizeof(struct S) + 40);
if (ps == NULL)
{
printf("%s\n",strerror(errno));
return 1;
}
ps -> a = 100;
int i = 0;
//给柔性数组成员赋值
for (i = 0; i < 10; i++)
{
ps->arr[i] = i;
}
//打印柔性数组成员内容
for (i = 0; i < 10; i++)
{
printf("%d ", ps->arr[i]);
}
//怕内存不够在使用 realloc 扩容内存 4+80
struct S* ptr = (struct S*)realloc(ps, sizeof(struct S) + 80);
if (ptr != NULL)
{
//将ptr给ps后面就不用再次释放了
ps = ptr;
ptr = NULL;
}
//释放malloc和realloc开辟的内存并置空
free(ps);
ps = NULL;
return 0;
}