目录
- 一:柔性数组的特点
- 二:柔性数组的使用
- 三:模拟实现柔性数组
在C99中,结构中的最后一个元素允许是未知大小的数组,这就叫做柔性数组成员
以下是柔性数组的两种写法:
//写法一:
struct S
{int n;char c;char arr[];//数组大小没有写说明它的大小是未知的 - - 柔性数组成员
};//写法二:
struct S
{int n;char c;char arr[0];//0也说明它的大小是未知的 - - 柔性数组成员
};
一:柔性数组的特点
- 结构体中的柔性数组成员前面必须至少一个其他成员
sizeof
返回的这种结构体大小不包括柔性数组的大小- 包含柔性数组成员的结构体用
malloc
函数进行动态内存分配,并且分配的内存应该大于结构体的大小,以适应柔性数组的预期大小。
//利用malloc进行空间分配
struct S
{int n;char arr[];//数组大小没有写说明它的大小是未知的 - - 柔性数组成员
};int main()
{printf("%d\n", sizeof(struct S));struct S* ps = (struct S*)malloc(sizeof(struct S) + 10 * sizeof(char));//后面的10 * sizeof(char)就是为arr数组开辟的return 0;
}
二:柔性数组的使用
#include <stdio.h>
#include <stdlib.h>struct S
{int n;char arr[];//数组大小没有写说明它的大小是未知的 - - 柔性数组成员
};int main()
{printf("%d\n", sizeof(struct S));struct S* ps = (struct S*)malloc(sizeof(struct S) + 10 * sizeof(char));//后面的10 * sizeof(char)就是为arr数组开辟的if (ps == NULL){perror("malloc");return 1;}//使用ps->n = 100;int i = 0;for (i = 0; i < 10; i++){ps->arr[i] = 'a';}for (i = 0; i < 10; i++){printf("%c ", ps->arr[i]);}//增容struct S* ptr = (struct S*)realloc(ps, sizeof(struct S) + 20 * sizeof(char));if (ptr == NULL){perror("realloc");return 1;}else{ps = ptr;}//释放free(ps);ps = NULL;return 0;
}
三:模拟实现柔性数组
struct S
{int n;char* arr;
};int main()
{struct S* ps = (struct S*)malloc(sizeof(struct S));if (ps == NULL){perror("malloc");return 1;}//为arr开辟指向的空间ps->arr = (char*)malloc(sizeof(char) * 10);//开辟10个字符型的空间if (ps->arr == NULL){perror("malloc");return 1;}//使用ps->n = 100;int i = 0;for (i = 0; i < 10; i++){ps->arr[i] = 'a';}for (i = 0; i < 10; i++){printf("%c ", ps->arr[i]);}//增容char* ptr = (char*)realloc(ps->arr, sizeof(char) * 20);if (ptr == NULL){perror("realloc");return 1;}else{ps->arr = ptr;}//使用for (i = 0; i < 20; i++){*((ps->arr)+i) = 'b';}for (i = 0; i < 20; i++){printf("%c ", *((ps->arr) + i));}//释放free(ps->arr);ps->arr = NULL;free(ps);ps = NULL;return 0;
}
常规的柔性数组,只需要malloc
一次,free
一次,并且空间是连续的,而模拟实现的柔性数组需要malloc
两次,free
两次,并且空间可能不连续。malloc
的次数越多,越容易出错,可能出现忘记释放导致内存泄漏问题。此外,malloc
的次数越多,产生的内存碎片就越多,内存利用率就会下降,造成内存空间浪费,malloc
次数越少,产生的北村碎片就越少,内存利用率就会增加,会避免内存空间浪费。并且空间连续的情况下,访问数据的时候效率就会更高。
今天的分享到这里就结束啦!如果觉得文章还不错的话,记得三连支持一下小恐龙,您的支持就是小恐龙前进的动力!