🍍个人主页🍍:🔜勇敢的小牛儿🚩
🔱推荐专栏🔱:C语言知识点
⚠️座右铭⚠️:敢于尝试才有机会
🐒今日鸡汤🐒:我们应该尽可能的花精力,做到有多牛;而不是用很多无用的努力,让自己显得有多牛。
一,柔性数组简介
1,柔性数组首先是一个数组。
2,柔性数组之所以叫柔性数组是因为它的大小是未指定的。
1.1🌰例🌰:
int arr[0]
int arr[]
1.2㊙️柔性数组的特点㊙️:
1.2.1:在结构体中柔性数组的前面必须要有一个其他成员
//比如在柔性数组前面放一个整型变量:
struct s {
int a;
int arr[0];
};
//在柔性数组前面放一个字符型变量
struct s {
char b;
int arr[0];
};
//在柔性数组前面放一个数组:
struct s {
int c[20];
int arr[0];
};
这样做的原因也很简单:就是为了确定结构体的大小。
🥚 例🥚:
struct s {
int a;
int arr[0];
};
int main() {
int room = sizeof(struct s);
printf("%d\n", room);
return 0;
}
像这样一个代码的结果是多少呢?
输出:4
//计算的结果其实是没有将柔性数组的大小算在结构体大小里面的
//这是因为柔性数组的大小是不确定的,所以在一个结构体的内部必须放入一个大小确定的变量来让结构体的大小能够确定下来。
1.2.2:包含柔性数组成员的结构用malloc ()函数进行内存的动态分配,并且分配的内存应该大于结构的大 小,以适应柔性数组的预期大小。
🌰例🌰:
struct s {
int a;
int arr[0];
}S;
int main() {
struct s* p = (struct s*)malloc(sizeof(S) + 10 * sizeof(int));
//在这里就要指定一下结构体的大小了,这个大小是由你来决定的。
//在这里我要加一个十个整型元素的数组,所以大小是结构体发小加上十个整型元素的大小。
if (p == NULL) {
printf("%s\n", strerror(errno));
return ;
}
else {
p->a = 5;
int i = 0;
for (i = 0;i < 10;i++) {
p->arr[i] = i + 1;
}
printf("%d\n", p->a);
for (i = 0;i < 10;i++) {
printf("%d ", p->arr[i]);
}
}
free(p);
p = NULL;
return 0;
}
三,柔性数组的优点❗❗❗:
先看两个例子:
struct s {
int a;
int arr[0];
}S;
int main() {
struct s* p = (struct s*)malloc(sizeof(S) + 10 * sizeof(int));
if (p == NULL) {
printf("%s\n", strerror(errno));
}
else {
p->a = 5;
int i = 0;
for (i = 0;i < 10;i++) {
p->arr[i] = i + 1;
}
printf("%d\n", p->a);
for (i = 0;i < 10;i++) {
printf("%d ", p->arr[i]);
}
}
//重新改变大小:
struct s* ptr = (struct s*)realloc(p, sizeof(struct s) + 20 * sizeof(int));
if (ptr == NULL) {
printf("%s\n", strerror(errno));
return 1;
}
p = ptr;
//使用:
//释放:
free(p);
p = NULL;
return 0;
这个例子就是想要将数组的空间进一步扩大,在这里只用一次malloc和realloc就可以了(就像例子里示范的那样)。
但是,如果你不使用柔性数组的话,那我们就是这样实现的:
struct s {
int a;
//这里不能放一个指定大小的数组,因为放一个指定大小的数组的话就不能更改空间大小了
int *arr;
};
int main() {
struct s* p = (struct s*)malloc(sizeof(struct s));
if (p == NULL) {
printf("%s\n", strerror(errno));
}
int* ptr = (int*)malloc(10 * sizeof (int));
if (ptr == NULL) {
printf("%s\n", strerror(errno));
}
else {
p->arr = ptr;
int i = 0;
for (i = 0;i < 10;i++) {
p->arr[i] = i + 1;
}
}
//使用
//现在我要对这个动态内存的大小进行调整
(int*)ptr = (int*)malloc(p->arr, 20 * sizeof(int));
if (ptr == NULL) {
printf("%s\n", strerror(errno));
}
else {
p->arr = ptr;
}
//使用
//释放,注意有先后顺序。这里要先释放数组arr的空间,再释放结构体的空间
free(p->arr);
free(p);
return 0;
}
3.1🔴区别🔴:
1.柔性数组的方法只用了一个malloc函数,第二种使用指针的方法用了两次malloc.
导致的区别:第一种方法只需要一次释放内存。
第二种方法则需要两次释放内存并需要讲究释放的顺序。
在这里其实就可以知道使用柔性数组的好处了:
1.使用柔性数组可以减少malloc函数的使用,减少释放时出现错误的几率。
2.因为减少了malloc函数的使用所以可以保证内存空间的连续性更强。提高内存的使用效率。
四,结语:
以上就是我今天的分享了,感谢你的阅读!!!