c语言-柔性数组

文章目录

  • 前言
  • 一、柔性数组的介绍
    • [1.1 柔性数组的定义](#1.1 柔性数组的定义)
  • 二、柔性数组的使用
    • [2.1 使用说明](#2.1 使用说明)
    • [2.2 结构体中的成员只包含一个柔性数组成员](#2.2 结构体中的成员只包含一个柔性数组成员)
    • [2.3 结构体中的成员包含其他成员和一个柔性数组成员](#2.3 结构体中的成员包含其他成员和一个柔性数组成员)
  • 三、模拟柔性数组
  • 总结

前言

本篇文章介绍c语言中的柔性数组。


一、柔性数组的介绍

1.1 柔性数组的定义

在定义一个结构体类型时,结构体的最后一个成员变量允许为一个没有大小的数组时,这个数组称为柔性数组。
注意点:柔性数组成员必须是结构体成员的最后一个成员

例如,下面定义一个拥有柔性数组的结构体类型

方式一:

c 复制代码
struct S
{
	int n;
	int arr[0];  //数组大小未知,柔性数组
};

方式二:

c 复制代码
struct S
{
	int n;
	int arr[];  //数组大小未知,柔性数组
};

二、柔性数组的使用

2.1 使用说明

  • sizeof返回的包含柔性数组的结构体的大小时,返回值不包括柔性数组的大小。
  • 包含柔性数组的结构体使用malloc()函数进行动态内存的分配,并且分配的内存大小应该大于结构体的大小,以适应柔性数组的预期大小。
  • 可以使用realloc()函数修改柔性数组的大小。

2.2 结构体中的成员只包含一个柔性数组成员

结构体定义:

c 复制代码
//结构体成员只存在柔性数组成员
struct Single_S
{
	int arr[0];
};

使用malloc()为柔性数组分配空间

c 复制代码
#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 结构体中的成员包含其他成员和一个柔性数组成员

结构体定义

c 复制代码
struct S
{
	int n;
	int arr[];  //数组大小为0,柔性数组
};

使用malloc()为柔性数组分配空间

c 复制代码
int main()
{
	//申请sizeof(struct S)+20
	struct 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)+40
	struct 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的内存监视查看内存情况

三、模拟柔性数组

结构体定义

c 复制代码
struct SS
{
	int n;
	int* arr;  //int*指针
};

为了模拟柔性数组,在创建结构体变量时,采用malloc()为结构体分配内存。

c 复制代码
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->arr
	free(ps->arr);
	ps->arr = NULL;
	//释放ps
	free(ps);
	ps = NULL;
	return 0;
}

通过vs的内存监视查看内存情况

使用这种方式,需要进行两次释放操作,首先释放数组的空间,然后释放结构体的空间。


总结

本篇文章介绍了柔性数组的定义和使用,最后模拟实现柔性数组。

相关推荐
yuuki2332333 小时前
【数据结构】用顺序表实现通讯录
c语言·数据结构·后端
ad钙奶长高高4 小时前
【C语言】扫雷游戏详解
c语言
丛雨要玩游戏6 小时前
字符函数和字符串函数
c语言·开发语言·算法
ad钙奶长高高6 小时前
【C语言】初始C语言
c语言·开发语言·算法
侯小啾7 小时前
【17】C语言-gets() 与 fgets() 函数
c语言·开发语言
是苏浙8 小时前
零基础入门C语言之枚举和联合体
c语言·开发语言
ACP广源盛1392462567310 小时前
(ACP广源盛)GSV2231---DisplayPort 1.4 MST 到 HDMI 2.0/DP/Type-C 转换器(带嵌入式 MCU)
c语言·开发语言·单片机·嵌入式硬件·音视频·mst
QT 小鲜肉10 小时前
【QT/C++】Qt网络编程进阶:UDP通信和HTTP请求的基本原理和实际应用(超详细)
c语言·网络·c++·笔记·qt·http·udp
Yurko1310 小时前
【C语言】选择结构和循环结构的进阶
c语言·开发语言·学习
范纹杉想快点毕业11 小时前
12个月嵌入式进阶计划ZYNQ 系列芯片嵌入式与硬件系统知识学习全计划(基于国内视频资源)
c语言·arm开发·单片机·嵌入式硬件·学习·fpga开发·音视频