柔性数组(C语言)

“柔性数组”从这个名字就可以看出来这种数组的大小大概是可以动态变化的。

事实也确实如此,在C99标准中,柔性数组有两个特点:是结构中最后一个成员;它的大小是未被定义的。如下:

struct S1
{
	int num;
	char c;
	int arr[];//柔性数组成员
};

struct S2
{
	int num;
	char c;
	int arr[0];//柔性数组成员
};

那么柔性数组该怎么实现呢?

联系动态内存的知识,我们知道,使用malloc函数可以轻松实现内存的动态变化,如果要实现柔性数组,就可以利用malloc开辟空间。但用malloc时,我们得知道要开辟的空间大小,这个空间一定要大于结构体的大小,不然容纳不了结构体。

问题就来了,存在柔性数组的结构大小是多少?我们不知道柔性数组的大小,似乎无法计算结构体的大小。而向解决这个问题实际上十分容易:使用sizeof运行一下代码就行,如下:

#include<stdio.h>
#include<stdlib.h>
struct S
{
	int num;
	int arr[0];//柔性数组成员
};

int main()
{
	printf("%d\n", sizeof(struct S));
	return 0;
}

运行结果是4,正好是int类型的大小,说明用sizeof计算含有柔性数组的结构体时,返回的值中不包含柔性数组的大小。这样的话,我们用malloc轻松实现柔性数组:

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

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

int main()
{
	struct S* ps = (struct S*)malloc(sizeof(struct S) + 20);
	if (ps == NULL)
	{
		perror("malloc\n");
		return 1;
	}

	//扩容
	struct S* p = (struct S*)realloc(ps, sizeof(struct S) + 40);
	if (p == NULL)
	{
		perror("realloc\n");
		return 1;
	}
	ps = p;

	//赋值
	ps->num = 10;
	int i = 0;
	for (i = 0; i < 10; i++)
	{
		ps->arr[i] = i;
	}

	//打印
	for (i = 0; i < 10; i++)
	{
		printf("%d ", ps->arr[i]);
	}

	//释放
	free(ps);
	ps = NULL;
	return 0;
}

运行结果如下:

注:1.本文中提到的结构都是含有柔性数组的结构。

       2.含有柔性数组的结构有2个以上的成员

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值