本节重点内容:
- 柔性数组的特点
- 柔性数组的使用
- 柔性数组的优势
⚡柔性数组
也许你从来没有听说过柔性数组(flexible array)这个概念,但是它确实是存在的。C99 中,结构中的最后一个元素允许是未知大小的数组,这就叫做『柔性数组』成员。
举例说明:
struct S
{
int a;
char c;
int arr[]; //int arr[0]
};
⚡柔性数组的特点和使用
- 结构中的柔性数组成员前面必须至少一个其他成员。
- sizeof 返回的这种结构大小不包括柔性数组的内存。
- 包含柔性数组成员的结构用malloc ()函数进行内存的动态分配,并且分配的内存应该大于结构的大小,以适应柔性数组的预期大小。
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include<stdlib.h>
#include<string.h>
struct S
{
int a;
char c;
int arr[]; //int arr[0]
};
int main()
{
printf("%d\n", sizeof(struct S));
struct S* ps = (struct S*)malloc(sizeof(struct S) + sizeof(int) * 10);
if (ps == NULL)
{
printf("%s\n", strerror(errno));
return 0;
}
int i = 0;
for (i = 0; i < 10; i++)
{
ps->arr[i] = i + 1;
}
for (i = 0; i < 10; i++)
{
printf("%d ", ps->arr[i]);
}
//调整数组arr大小
struct S* ptr = (struct S*)realloc(ps, sizeof(struct S) + sizeof(int) * 20);
if (ptr == NULL)
{
printf("%s\n", strerror(errno));
return 0;
}
else
{
ps = ptr;
}
//使用
//……
free(ps);
ps = NULL;
return 0;
}
运行结果如下:
⚡柔性数组的优势
使用结构体指针来进行模拟实现:
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include<stdlib.h>
#include<string.h>
struct S
{
int a;
char c;
int* arr;
};
int main()
{
struct S* ps = (struct S*)malloc(sizeof(struct S));
if (ps == NULL)
{
perror("malloc\n");
return 0;
}
int* ptr = (int*)malloc(sizeof(int)*10);
if (ptr == NULL)
{
perror("malloc2\n");
return 0;
}
else
{
ps->arr = ptr;
}
//使用
int i = 0;
for (i = 0; i < 10; i++)
{
ps->arr[i] = i + 1;
}
//打印
for (i = 0; i < 10; i++)
{
printf("%d ", ps->arr[i]);
}
/*对arr进行扩容*/
ptr = (int*)realloc(ps->arr,sizeof(int) * 20);
if (ptr == NULL)
{
perror("realloc\n");
return 0;
}
else
{
ps->arr = ptr;
}
free(ptr);
ptr = NULL;
free(ps);
ps = NULL;
return 0;
}
使用柔性数组和结构体指针都可以完成同样的功能,两者之间的对比:
- 柔性数组好处是:方便内存释放
malloc 一次,free 一次,容易维护空间,不容易出错。内存碎片就会减少,内存利用率就较高一些。
- 结构体指针好处是:有利于访问速度
连续的内存有益于提高访问速度,也有益于减少内存碎片。但是 malloc 两次,free 两次,维护难度加大,容易出错。内存碎片就会增多,内存利用率就下降了。
由于内存碎片比较小,在日后被利用的可能性就比较小。
感谢大家能够看完这篇博客,创作时长,小伙伴们觉得我的博客对你有帮助,不妨留下你的点赞的收藏,关注我,带你了解不一样的C语言。