介绍柔性数组

目录

一、柔性数组的定义

二、柔性数组的特点

三、柔性数组的优势


一、柔性数组的定义

柔性数组是一种特殊的数据结构,他在结构体尾部定义一个长度不确定的数组,常用于动态内存分配,可以方便地创建具有可变长度的数据结构

二、柔性数组的特点

1、结构体中的柔性数组成员前面必须至少一个其他成员

2、sizeof返回结构体内存不包括柔性数组的内存

例如:

#include<stdio.h>

struct S
{
	int n;
	int arr[];//柔性数组成员
};

int main()
{
	int sz = sizeof(struct S);
	printf("%d\n", sz);

	return 0;
}

sz只返回了4个字节,也就是n所占的字节

3、包括柔性数组的结构体用malloc函数进行动态内存分配,并且分配的内存应该大于结构体的内存,以适应柔性数组的预期大小

方案1:

#include<stdio.h>
#include<stdlib.h>

struct S
{
	int n;
	int arr[];//柔性数组成员
};

int main()
{
	//struct S s;只有4个字节

	//柔性数组的使用
	struct S* ps = (struct S*)malloc(sizeof(struct S) + 40);//44个字节
	if (ps == NULL)
	{
		return 1;
	}

	ps->n = 100;
	int i = 0;
	for (i = 0; i < 10; i++)
	{
		ps->arr[i] = i;
	}
	for (i = 0; i < 10; i++)
	{
		printf("%d ", ps->arr[i]);
	}

	struct S* ptr = (struct S*)realloc(ps, sizeof(struct S) + 80);
	if (ptr != NULL)
	{
		ptr = ps;
	}
	//释放
	free(ps);
	ps = NULL;

	return 0;
}

用malloc动态内存分配44个字节,malloc返回所分配内存块起始地址,我们需要用结构体类型的指针ps来接收。柔性体现在可以用realloc重新进行动态内存分配,ptr和ps指向的是同一块内存空间,所以在释放时直接释放ps即可

方案2:

#include<stdio.h>
#include<stdlib.h>

struct S
{
	int n;
	int* arr;
};

int main()
{
	struct S* ps = (struct S*)malloc(sizeof(struct S));
	if (ps == NULL)
	{
		return 1;
	}
	ps->n = 100;
	ps->arr = (int*)malloc(40);
	if (ps->arr == NULL)
	{
		return 1;
	}
	//使用
	int i = 0;
	for (i = 0; i < 10; i++)
	{
		ps->arr[i] = i;
	}
	for (i = 0; i < 10; i++)
	{
		printf("%d ", ps->arr[i]);
	}
	//扩容
	int* ptr = (int*)realloc(ps->arr, 80);
	if (ptr == NULL)
	{
		return 1;
	}
    //使用
    //.......
	//释放
	free(ps->arr);
	free(ps);
	ps = NULL;
	
	return 0;
}

用malloc申请结构体的内存,再用一次申请数组arr的内存,在释放时也要释放结构体和数组的内存,用起来没有方案一便利,方案一是一次申请和一次释放.

三、柔性数组的优势

第一个好处:方便内存释放。申请一次内存,释放一次内存

第二个好处:这样有利于访问速度。但多次使用malloc申请内存会导致内存碎片变多

  • 14
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值