4.4(预习部分)

文章讨论了如何使用结构体存储特定信息,目标是减少内存占用。首先给出了一个简单的结构体定义,然后提出了使用堆栈空间和计算内存的需求。接着,文章转向使用单向链表来优化内存,通过动态分配内存减小了存储开销。在实现过程中,遇到了字符串长度与结构体定义不匹配的问题,并解决了这个问题。最后,比较了两种方法的内存使用情况,链表的实现使用了更少的内存。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目前有三组信息:

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

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

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

要求:定义一个结构体去存储这些信息,且使用尽可能少的内存区域去存储这些信息。结构体赋值和打印必须使用专门的函数。提示:可以使用各种数据类型,可以使用映射关系减少落地内存,也可以使用位操作。
程序流程:结构体初始化,结构体挨个赋值,最后是结构体信息打印输出,输出结构体信息的同时一并输出当前结构体内存大小。
而且赋值和打印,必须是你们自己写的专用函数*/
 
#include<stdio.h>
#include <stdlib.h>
#include <string.h>
    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.位操作不是很熟悉

在这里插入图片描述

#include<stdio.h>
#include <stdlib.h>
#include <string.h>
#include<malloc.h>
#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

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Back~~

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

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

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

打赏作者

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

抵扣说明:

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

余额充值