柔性数组
C99标准下,结构体中的最后一个元素允许是未知大小,着就叫做"柔性数组"成员。
例如:
typedef struct wuhu
{
int a;
int a[0];//柔性数组成员
}WUHU;
有些编译器会报错可以将 int a[0]; 改为 int a[];
柔性数组的特点
- 1.结构体中柔性数组成员前面必须包含一个其他成员。
- 2.sizeof返回的这种结构大小不包括柔性数组的内存。
- 3.包含柔性数组的结构用malloc()函数进行内存的动态分配,并且分配的内存应该大于结构的大小,以适应柔性数组的预期大小。
例:
typedef struct wuhu
{
int a;
int a[0];
}WUHU;
int main()
{
printf("%d",sizeof(WUHU));//4
return 0;
}
输出结果为4
柔性数组的使用
typedef struct wuhu
{
int a;
int arr[0];
}WUHU;
int main()
{
int i = 0;
WUHU* p = (WUHU*)malloc(sizeof(WUHU) + 100 * sizeof(int));
// 结构体+数组元素个数*sizeof(int);
p->a = 100;//赋值a
for (i = 0; i < 100; i++)
{
p->arr[i] = i;//赋值arr数组中100个元素
}
for (i = 0; i < 100; i++)
{
printf("%d ", p->arr[i]);
}
free(p);
p = NULL;
return 0;
}
柔性数组arr相当于获得了100个元素整形元素的连续空间。
如果不使用柔性数组也可以实现
例:
typedef struct wuhu
{
int a;
int* p_a;
}WUHU;
int main()
{
int i = 0;
WUHU* p = (WUHU*)malloc(sizeof(WUHU));
p->a = 100;
p->p_a = (int*)malloc(100 * sizeof(int));//p_a再指向一块内存开辟数组
for (i = 0; i < 100; i++)
{
p->p_a[i] = i;
}
for (i = 0; i < 100; i++)
{
printf("%d ", p->p_a[i]);
}
free(p->p_a);//先释放p->a,若先释放p则无法找到p_a会导致内存泄漏
p->p_a = NULL;
free(p);
p = NULL;
return 0;
}
这样写也能实现柔性数组的功能 ,但是有两个缺点。
- 1.释放内存不方便:当使用第二个函数时由于有两次空间开辟 使用需要释放两次内存。
- 2.不利于访问数度:连续内存有利于访问速度,也有益于减少内存碎片。