利用结构体的特性,实现柔性数组
先看特性:
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;
}