目录
一、概念
1.定义
柔性数组(Flexible Array Member)是一种在C语言中使用的特殊数据结构。简单来说,柔性数组就是结构体内的最后一个元素是大小未知的数组。
2.特点
1.柔性数组前面必须要有其他成员。
2.sizeof计算结构体内存大小的时候是不计算柔性数组的大小的。
struct S
{
int n;
int arr[];
};
int main()
{
//sizeof返回的这种结构体大小不包括柔性数组的内存
int sz = sizeof(struct S);
printf("%d ", sz);
struct S s;//4,不包括柔性数组
return 0;
}
3.包含柔性数组的结构体的内存大小需要用malloc分配,分配的大小必须要大于结构体自身的大小,否则柔性数组就不能使用了。
二、举例
struct S
{
int n;
int arr[];
};
int main()
{
//柔性数组的使用
struct S* ps = (struct S*)malloc(sizeof(struct S) + 40);
if (ps == NULL)
{
printf("%s\n", strerror(errno));
return 1;
}
ps->n = 100;
int i = 0;
for (; i < 10; i++)
{
ps->arr[i] = i;
}
for (i = 0; i < 10; i++)
{
printf("%d ", ps->arr[i]);
}
struct S* ptr = (struct S*)realloc(ps, sizeof(struct S) + 80);
if (ptr != NULL)
{
ps = ptr;
}
free(ps);
ps = NULL;
return 0;
}
代码解释
1.首先定义了一个结构体 struct S,它有一个整型成员 n 和一个不定大小的数组 arr[]。
struct S
{
int n;
int arr[];
};
2.在 main 函数中,首先通过 malloc 分配了一块内存,这块内存的大小是 struct S 的大小加上40个整型的空间。然后通过强制类型转换将这块内存的地址赋给了一个 struct S 类型的指针 ps。
struct S* ps = (struct S*)malloc(sizeof(struct S) + 40);
3.如果内存分配失败(malloc 返回 NULL),则打印错误信息并返回1。
4.接着,给 ps 的 n 成员赋值为100,然后在一个循环中给 arr[] 数组赋值为0到9。
再接下来的循环中,打印出 arr[] 数组的值。
5.然后,通过 realloc 重新分配内存,这次的大小是原来的大小加上80个整型的空间。如果分配成功,则更新 ps 的值。
6.最后,释放 ps 所指向的内存,并把 ps 置为 NULL。
7.主函数返回0,程序结束。
注意事项
这段代码主要展示了如何使用 "柔性数组成员",但需要注意,这种方式在某些情况下可能会导致内存分配的不连续,从而影响性能。同时,在使用 malloc 和 realloc 时,需要确保正确处理内存分配失败的情况
三、优点
- 方便内存释放:由于柔性数组是动态分配的,因此我们只需要在程序结束时释放相应的内存即可,而不需要像传统数组那样需要逐个手动释放内存。
- 有利于访问速度:由于柔性数组是根据实际需要动态分配的,因此在访问时可以更快地找到所需的数据,提高了程序的运行效率。
- 方便扩展:柔性数组可以根据实际需要随时扩展或收缩,使得程序更加灵活和可维护。
- 提高内存利用率:由于柔性数组可以根据实际需要动态分配内存,因此可以更充分地利用内存空间,避免内存浪费。
总结:柔性数组是一种非常实用的数据结构,它可以提高程序的效率和可维护性,同时也方便了我们的代码编写和内存管理。