文章目录
- 前言
- 一、柔性数组的介绍
- 1.1 柔性数组的定义
- 二、柔性数组的使用
- 2.1 使用说明
- 2.2 结构体中的成员只包含一个柔性数组成员
- 2.3 结构体中的成员包含其他成员和一个柔性数组成员
- 三、模拟柔性数组
- 总结
前言
本篇文章介绍c语言中的柔性数组。
一、柔性数组的介绍
1.1 柔性数组的定义
在定义一个结构体类型时,结构体的最后一个成员变量允许为一个没有大小的数组时,这个数组称为柔性数组。
注意点:柔性数组成员必须是结构体成员的最后一个成员
例如,下面定义一个拥有柔性数组的结构体类型
方式一:
struct S
{int n;int arr[0]; //数组大小未知,柔性数组
};
方式二:
struct S
{int n;int arr[]; //数组大小未知,柔性数组
};
二、柔性数组的使用
2.1 使用说明
- sizeof返回的包含柔性数组的结构体的大小时,返回值不包括柔性数组的大小。
- 包含柔性数组的结构体使用malloc()函数进行动态内存的分配,并且分配的内存大小应该大于结构体的大小,以适应柔性数组的预期大小。
- 可以使用realloc()函数修改柔性数组的大小。
2.2 结构体中的成员只包含一个柔性数组成员
结构体定义:
//结构体成员只存在柔性数组成员
struct Single_S
{int arr[0];
};
使用malloc()为柔性数组分配空间
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<errno.h>
int main()
{struct Single_S* ps = (struct Single_S*)malloc(20);if (NULL == ps){printf("%s\n", strerror(errno));return 1;}//使用int i = 0;for (i = 0; i < 5; i++){ps->arr[i] = i;}//动态修改struct Single_S* ptr = (struct Single_S*)realloc(ps,40);if (ptr != NULL){ps = ptr;ptr = NULL;//使用从ps->arr[5]开始,因为0~4已经初始化for (i = 5; i < 10; i++){ps->arr[i] = i;}}//释放free(ps);ps = NULL;return 0;
}
通过vs的内存监视查看内存情况
2.3 结构体中的成员包含其他成员和一个柔性数组成员
结构体定义
struct S
{int n;int arr[]; //数组大小为0,柔性数组
};
使用malloc()为柔性数组分配空间
int main()
{//申请sizeof(struct S)+20struct S* ps = (struct S*)malloc(sizeof(struct S)+20);if (NULL == ps){printf("%s\n", strerror(errno));return 1;}//使用ps->n = 5;int i = 0;for (i = 0; i < 5; i++){ps->arr[i] = i; //赋值}//扩容sizeof(struct)+40struct S* ptr = (struct S*)realloc(ps,sizeof(struct S)+40);if (ptr != NULL){ps = ptr;ptr = NULL;//使用ps->n = 10;for (i = 5; i < 10; i++){ps->arr[i] = i; //赋值}}//释放free(ps);ps = NULL;return 0;
}
通过vs的内存监视查看内存情况
三、模拟柔性数组
结构体定义
struct SS
{int n;int* arr; //int*指针
};
为了模拟柔性数组,在创建结构体变量时,采用malloc()为结构体分配内存。
int main()
{//创建结构体struct SS* ps = (struct SS*)malloc(sizeof(struct SS));if (NULL == ps){printf("%s\n", strerror(errno));return 1;}//创建一块5个int大小的空间ps->arr = (int*)malloc(5*sizeof(int));if (ps->arr != NULL){ps->n = 5;int i = 0;for (i = 0; i < 5; i++){ps->arr[i] = i; //赋值}}//扩容int* ptr = (int*)realloc(ps->arr, 10*sizeof(int));if (ptr != NULL){ps->arr = ptr;ptr = NULL;ps->n = 10;int j = 0;for (j = 5; j < 10; j++){ps->arr[j] = j; //赋值}}//释放ps->arrfree(ps->arr);ps->arr = NULL;//释放psfree(ps);ps = NULL;return 0;
}
通过vs的内存监视查看内存情况
使用这种方式,需要进行两次释放操作,首先释放数组的空间,然后释放结构体的空间。
总结
本篇文章介绍了柔性数组的定义和使用,最后模拟实现柔性数组。