Day 13 柔性数组 3.29

柔性数组

结构体的最后一个元素可以被允许是一个未知大小的数组,就叫做柔性数组。

#include <stdio.h>
#include <stlib.h>

struct S1
{
    int num;
    double d;
    int arr[];    //柔性数组成员。
};

//或者

struct S2
{
    int num;
    double d;
    int arr[0];    //柔性数组成员。
};

struct S3
{
    int num;
    int arr[];    
};

int main()
{
    printf("%d\n",sizeof(struct S3));
    return 0;
}
//这样打印的结果为4,
//因为柔性成员前面必须有其他成员,这样计算的就是前面int的大小也就是4个字节。
//而且size返回这种结构不会包括柔性数组的内存。
//包含柔性暑促成员的结果用malloc()函数进行内存的动态分配。并且分配的内存一个大于结构
int main()
{
    struct S3* ps = (struct S3*)malloc(sizeof(struct S3)+40);
    //前面4个字节给num,后面40个字节给arr。40就是预留给柔性数组的空间。
    //这个40可以通过realloc来调整。

    if( ps == NULL)
    {
        perror("malloc"):
        return 1;
    }

    ps->num = 100;
    //在结构体成员num中放置100。

    int i = 0;
    for(i = 0; i<10; i++)
    {
        ps->arr[i] = i;
        //放置元素。
    }
    
    //扩容
    struct S3* ptr = (struct S3*)realloc(ps,sizeof(struct S3)+80);
    if(ptr == NULL)
    //判断扩容是否成功。
    {
        perror("realloc\n");
        return 1;
    }
    else
    {
        ps = ptr;
    }
    for(i = 10;i < 20; i++)
    {
        ps->arr[i] = i;
    }
    for(i = 0;i < 20; i++)
    {
        printf("%d ",ps->arr[i]);
    }

    //释放
    free(ps);
    ps = NULL;

    return 0;
}

#include <stdio.h>
struct S4
{
	int num;
	int* arr;
};

int main()
{
	struct S4* ps = (struct S4*)malloc(sizeof(struct S4));
	if (ps == NULL)
	{
		return 1;
	}
	ps->arr = (int*)malloc(40);
	if (ps->arr == NULL)
	{
		free(ps);
		ps = NULL;
		return 1;
	}
	//使用
	//...
	
	//释放
	free(ps->arr);
	ps->arr = NULL;

	free(ps);
	ps = NULL;
	return 0;
}

上面两组代码都可以完成同样的功能,但是前一种有几点好处。

方便内存释放,不是柔性数组的需要判断两次,释放两次。

柔性数组申请的空间的连续的,访问速度更快。非柔性数组会造成内存碎片(内存空间的浪费),导致内存利用率下降。因为malloc开辟了两次,开辟的空间不会连续。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值