为什么结构体新变量的定义不能在主函数里面,必须要在外面?如果定义在主函数里面的话,就会有一大堆报错
应该是可以的,只是放在函数体内,其他函数就不知道这个结构体的定义,所以会报错。
柔性数组的形式和堆区开辟连续空间的形式,部分地方略有差异。
这里的X
是一个#define
定义的标识符,大小为3
void menu()
{
printf("**************************************\n");
printf("********0.Eixt 1.Add **********\n");
printf("********2.Delete 3.Search **********\n");
printf("********4.Modify 5.Order **********\n");
printf("********6.Show 7.Clear **********\n");
printf("**************************************\n");
}
堆区开辟连续空间
这里的
Con
不是指针,是一个结构体变量,在传参的时候需要传址调用。因为通过增删查改等操作,可能会改变其内部成员。
还有一个原因,形参是实参的一份临时拷贝,假设通讯录很大,如果传值调用,这个形参要开辟同样大的空间,太浪费空间了,而传址调用只需要开辟4个字节(32位平台下)。
int main()
{
Contacts Con = { NULL,0,0 };
Con.data = (People*)malloc(sizeof(People) * X);
memset(Con.data, 0, sizeof(People) * X);
Con.total = 0;
int x = 0;
do
{
menu();
scanf("%d", &x);
switch (x)
{
case Exit:
printf("退出通讯录");
break;
case Add:
AddContact(&Con);
break;
case Delete:
DelContact(&Con);
break;
case Search:
SerContact(&Con);
break;
case Modify:
ModContact(&Con);
break;
case Order:
OrderContact(&Con);
break;
case Show:
ShowContact(&Con);
break;
case Clear:
ClearContact(&Con);
break;
default:
printf("输入错误\n");
break;
}
} while (x);
return 0;
}
柔性数组
Con
是一个指针变量,在不需要改变指针变量空间中存放的地址时,传指针变量就可以操作指针指向的内容。这里Add、Clear
操作略有不同呢,这和realloc
有关,也和形参有关。
堆区开辟一块连续空间
柔性数组
int main()
{
Contacts* Con = (Contacts*)malloc(sizeof(Contacts) + sizeof(People) * X);
Con->total = X;
Con->count = 0;
int x = 0;
do
{
menu();
scanf("%d", &x);
printf("Main-->%p\n", Con);
switch (x)
{
case Exit:
printf("退出通讯录");
break;
case Add:
Con = AddContact(Con);
break;
case Delete:
DelContact(Con);
break;
case Search:
SerContact(Con);
break;
case Modify:
ModContact(Con);
break;
case Order:
OrderContact(Con);
break;
case Show:
ShowContact(Con);
break;
case Clear:
Con = ClearContact(Con);
break;
default:
printf("输入错误\n");
break;
}
} while (x);
free(Con);
Con = NULL;
return 0;
}