柔性数组创建以及使用

利用结构体的特性,实现柔性数组

先看特性:

struct text1 {
	int num;
	char name[20];
	int arr[];
};
struct text2 {
	int num;
	char name[20];
};
void main() {
	struct text1 t1;
	struct text2 t2;
	printf("结构体text1的大小为:%d \n", sizeof(t1));
	printf("结构体text2的大小为:%d \n", sizeof(t2));
}

此程序输出的结果为:

结构体text1的大小为:24
结构体text2的大小为:24

从结果可以看出,第一个结构体比第二个结构体多了一个参数int arr[],但最后的结果确实两个结构体的大小相同。可以说明,在计算结构体时,如果结构体中存在未给定长度的数组,那么在计算时,将会忽略这个数组。

下面代码将演示如何实现柔性数组

struct text1 {
	int num;
	char name[20];
	int arr[];
};

void main() {
	struct text1 *t1;
	//期望arr是10个整形数组
	int arrNum = 10;
	t1 = (struct text1*)malloc(sizeof(struct text1)+arrNum*sizeof(int));//给arr数组分配空间,申请(原数据结构的大小+arr数组的大小)
	t1->num = arrNum;
	//此时,就已经完成为数组arr分配空间,使用num来记录一下分配的个数
	 
	//如果在使用中arr数组个数不足,需要开辟更大的空间
	int addNum = 10;
	struct text1 *pstruct=realloc(t1,sizeof(struct text1)+(t1->num+addNum)*sizeof(int));
	if (pstruct!=NULL) {//为了防止开辟空间失败导致空间丢失
		t1 = pstruct;
		t1->num += addNum;
		pstruct = NULL;
	}
	//给数组赋值
	for (int i = 0; i <= t1->num - 1;i++) {
		t1->arr[i] = i;
	}
	//打印数组
	for (int i = 0; i <= t1->num - 1;i++) {
		printf("%d ",t1->arr[i]);
	}
	//销毁数组
	free(t1);
	t1 = NULL;
}
 

读者乍一看,可能感觉这样的作用不大,如果我们把数组换为其他数组类型呢?比如结构体

struct peoInfo {
	char name[20];
	int age;
	char addr[50];
	char tele[12];
};

struct ContractPeo {
	struct peoInfo* data;
	int sz;//联系人数量
	int zone;//通讯录总空间大小
}con;
void main() {
	//初始化通讯录
	int initNum = 20;
	con.data = (struct data*)malloc(sizeof(struct peoInfo)+initNum*sizeof(int));
	con.zone = initNum;
	//添加联系人,假如我们已经添加了20个联系人,达到了空间的上限,就需要开辟新的空间
	con.sz = 20;//联系人达到空间上限
	int addNum = 10;//依次增加十个人的空间上限
	struct people *p=(struct peoInfo*)realloc(con.data,(addNum+initNum)*sizeof(struct peoInfo));
	if (p!=NULL) {
		con.data=p;
		p = NULL;
	}
	con.zone += addNum;//这个时候,空间的上限变成了30
	//  TO  DO.......
	//我们将联系人设置为0进行测试
	con.sz = 0;
	for (int i = 0; i <= con.zone-1;i++) {
		con.data->name[i] = i;
		con.data->tele[i] = i;
		con.sz++;//增加完一个联系人
	}
	printf("姓名	电话\n");
	for (int i = 0; i <= con.zone - 1; i++) {
		printf("%d	 ", con.data->name[i]);
		printf("%d ", con.data->tele[i]);
		printf("\n");
	}
        free(con.data);
        con.data=NULL;
}

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

蠢 愚

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值