4.4(预习部分)

目前有三组信息:

名字:tony,18,leader,口头禅“今天我必须是最帅的一个”,
名字:red,12,committee,口头禅“我必须是今天最帅的一个”,
名字:black,16,student,口头禅“今天最帅的一个必须是我”,

要求:定义一个结构体去存储这些信息,且使用尽可能少的内存区域去存储这些信息。结构体赋值和打印必须使用专门的函数。提示:可以使用各种数据类型,可以使用映射关系减少落地内存,也可以使用位操作。
程序流程:结构体初始化,结构体挨个赋值,最后是结构体信息打印输出,输出结构体信息的同时一并输出当前结构体内存大小。

/*下一次课的题目:目前有三组信息:
名字:tony,18,leader,口头禅“今天我必须是最帅的一个”,
名字:red,12,committee,口头禅“我必须是今天最帅的一个”,
名字:black,16,student,口头禅“今天最帅的一个必须是我”,

要求:定义一个结构体去存储这些信息,且使用尽可能少的内存区域去存储这些信息。结构体赋值和打印必须使用专门的函数。提示:可以使用各种数据类型,可以使用映射关系减少落地内存,也可以使用位操作。
程序流程:结构体初始化,结构体挨个赋值,最后是结构体信息打印输出,输出结构体信息的同时一并输出当前结构体内存大小。
而且赋值和打印,必须是你们自己写的专用函数*/
 
#include
#include 
#include 
    typedef struct Databese
    {
	char name[5];
    	int age;
    	char occupation[10];
    	char mantra[20];
	}ds;
	
    void Input(ds *member , int n);
    void Output(ds *member,int n);
  
  int main()
  {
  	ds member[3]={0};//初始化 
  	Input(member ,sizeof(member)/sizeof(member[0]));
  	Output(member,sizeof(member)/sizeof(member[0]));
  	return 0;
  }

	 void Input(ds *member , int n)
	 {
	 	int i=0;
	 	for(i=0;i<n;i++)
	 	{ 
	 	  printf("名字:");
	      scanf("%s %d %s %s",&member[i].name,&member[i].age,&member[i].occupation,&member[i].mantra);//这里没用scanf_函数
		}
	 }

     void Output(ds *member,int n)
	 {
     	int i=0;
     	int size=0;
     	for(i=0;i<n;i++)
		 {
		    size=sizeof(member[i]);
		 	printf("名字:%s %d %s %s\n",member[i].name,member[i].age,member[i].occupation,member[i].mantra);
		    printf("%d\n",size);
		 } 
	 }
	 
	 问题:1.上面我自己没有申请空间,用堆空间,系统自动分配的栈空间,所利用的大小,是不是自动分配会可以通过自己计算规划内存呢?
	 2.如果用单向链表,是否会减小内存的使用?
	  3.位操作不是很熟悉

4.4(预习部分)_第1张图片

#include
#include 
#include 
#include
#define LEN sizeof(struct Databese)
 typedef struct Databese
      {
	    char name[5];
    	int age;
    	char occupation[10];
    	char mantra[20];
    	struct Databese *next;
      }ds;
      
   ds *input();
   ds  output(ds *head);
   int main()
   {
   	ds *head;
   	head=input();
   	output(head);
   }
   
   ds*input()
   {
   	int i=0;
    char name[5]={0};
    int age=0;
    char occupation[10]={0};
    char mantra[40]={0};
    ds *head=NULL,*p=NULL,*tmp=NULL;
    p=(ds*)malloc(LEN);
    if(p==NULL)
    {
    	return 0;
	}
	printf("名字:");
	scanf("%s %d %s %s",&name,&age,&occupation,&mantra);
	strcpy(p->name,name);
	p->age=age;
	strcpy_s(p->occupation,10,occupation );
    strcpy_s(p->mantra,40,mantra );
    head=p;
    for(i=0;i<2;i++)
    {
    	 tmp=(ds*)malloc(LEN);
    	 if(tmp==NULL)
        {
    	return 0;
	    }
	    printf("名字:");
     	 scanf("%s %d %s %s",&name,&age,&occupation,&mantra);
	     strcpy(tmp->name, name);
         tmp->age=age;
	    strcpy_s(tmp->occupation,10,occupation );
        strcpy_s(tmp->mantra,40,mantra);
        p->next=tmp;
        p=p->next;
    }
	return head;
   }
    ds  output(ds *head)
    {
    	int size=0;
    	ds*p;
    	for(p = head; p != NULL; p = p->next)
    	{
    	 size=sizeof(p);
    	 printf("名字:%s %d %s %s\n",p->name,p->age,p->occupation,p->mantra);
    	 printf("%d\n",size);
    	}
}
问题:1.在input里最开始mantra我写的是mantra[20],运行发现无法输出,后面改成了[40],结构体里面没做改变
2.确实这里的结构体变小了
3.上个代码得到的大小是44,而在这段代码中是8

4.4(预习部分)_第2张图片

你可能感兴趣的:(c语言,学习)