为啥结构体变量的定义不在主函数

为什么结构体新变量的定义不能在主函数里面,必须要在外面?如果定义在主函数里面的话,就会有一大堆报错

img

应该是可以的,只是放在函数体内,其他函数就不知道这个结构体的定义,所以会报错。

  • 你可以参考下这个问题的回答, 看看是否对你有帮助, 链接: https://ask.csdn.net/questions/274845
  • 这篇博客也不错, 你可以看下结构体作为参数,在函数里面直接修改结构体内的值
  • 除此之外, 这篇博客: 单链表 和 顺序表 实现的 通讯录中的 🍓主函数的设计 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
  • 柔性数组的形式和堆区开辟连续空间的形式,部分地方略有差异。
    这里的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;
    }
    
  • 您还可以看一下 覃秉丰老师的5天搞定深度学习进阶系列教程课程中的 课程介绍,推荐系统算法介绍小节, 巩固相关知识点