柔性数组:C99中,结构体的最后一个元素允许是未知大小的数组,这就叫柔性数组的成员。
柔性数组的特点:
1.结构体中的柔性数组成员前面必须至少一个其他成员
2.sizeof返回的这种结构大小不包括柔性数组的内存
3.包含柔性数组成员的结构用malloc()函数进行内存的动态分配,并且分配的内存应该大于结构的大小,以适应柔性数组的预期大小。
代码1:柔性数组
//struct S
//{
// int n;
// int arr[];//未知大小的数组
//};
struct S
{
int n;
int arr[0];//未知大小的数组 -柔性数组成员 -数组的大小是可以调整的
};
int main()
{
struct S s;
printf("%d\n", sizeof(s));//4 -计算结构体大小的时候 不包含柔性数组成员
struct S *ps = (struct S*) malloc(sizeof(struct S) + 5 * sizeof(int));
int i = 0;
for (i = 0; i < 5; i++)
{
ps->arr[i] = i;
}
for (i = 0; i < 5; i++)
{
printf("%d ", ps->arr[i]);//0 1 2 3 4
}
struct S* ptr = realloc(ps, 44);
if (ptr != NULL)
{
ps = ptr;
}
for (i = 5; i < 10; i++)
{
ps->arr[i] = i;
}
for (i = 0; i < 10; i++)
{
printf("%d ", ps->arr[i]);//0 1 2 3 4 5 6 7 8 9
}
//释放
free(ps);
ps = NULL;
return 0;
}
代码2:没有使用柔性数组
struct S
{
int n;
int* arr;
};
int main()
{
struct S *ps = (struct S*)malloc(sizeof(struct S));
ps->arr = malloc(5 * sizeof(int));
int i = 0;
for (i = 0; i < 5; i++)
{
ps->arr[i] = i;
}
for (i = 0; i < 5; i++)
{
printf("%d ", ps->arr[i]);//0 1 2 3 4
}
//调整大小
int *ptr = realloc(ps->arr, 10 * sizeof(int));
if (ptr != NULL)
{
ps->arr = ptr;
}
for (i = 5; i < 10; i++)
{
ps->arr[i] = i;
}
for (i = 0; i < 10; i++)
{
printf("%d ", ps->arr[i]);//0 1 2 3 4 5 6 7 8 9
}
free(ps->arr);//先释放
ps->arr = NULL;
free(ps);//后释放 如果先释放 后面就会找不到ps->arr
ps = NULL;
return 0;
}