五大板块(3)—— 结构体

参考:五大板块(3)—— 结构体
作者:丶PURSUING
发布时间: 2021-03-18 16:02:43
网址:https://blog.csdn.net/weixin_44742824/article/details/114981743

目录

  • 结构体的三种定义赋值方法
  • 结构体数组
  • 结构体指针(在指针中已有介绍)
  • 结构体的综合运用👉学生成绩处理
    • 小问题:不会释放指针,或者需不需要释放?
  • 结构体大小计算方法

结构体的三种定义赋值方法

#include <stdio.h>
#include <string.h>struct student
{int englishScore;int mathScore;int chineseScore;char name[128];};//此处分号易漏int main()
{//一、在结构体变量定义的时候就赋值,此时要全部赋值struct student stu1={100,100,100,"周星星"};//二、先定义,后赋值,不需要全部赋值struct student stu2;stu2.englishScore = 90;//stu2.name = "张大大";      //结构体(类)中:JAVA c++可以这么赋值  C语言不可以!strcpy(stu2.name,"张大大");//C语言中字符串必须通过strcpy进行赋值//char *str="我爱你";     初始化可以直接用指针变量指向该字符串//chat *str;              指针和值分开要用到strcpy进行赋值//str = (char*)malloc(128);//memset(str,'\0',128);//strcpy(str,"我爱你");   //三、常用的部分赋值方式,多见于内核源码对结构体的定义struct student stu3={.name = "华天朱",.englishScore = 90,.mathScore = 80,    //此处是逗号};//分号易漏printf("stu1的名字是:%s,分数:%d\n",stu1.name,stu1.englishScore);printf("stu2的名字是:%s,分数:%d\n",stu2.name,stu2.englishScore);printf("stu3的名字是:%s,分数:%d\n",stu3.name,stu3.englishScore);return 0;
}

运行结果:

stu1的名字是:周星星,分数:100
stu2的名字是:张大大,分数:90
stu3的名字是:华天朱,分数:90
  • 1
  • 2
  • 3

为什么使用strcpy?
如果不在结构体变量初始化的时候就对具有数组类型的表达式赋值,则要使用strcpy,即不能直接赋值。

线下班常犯下的致命问题

struct data1{
char*p;
};struct data2{
char p[128]};
两者区别在于前者为野指针,不清楚指向什么地址,访问时(使用strcpy())会报错
必须要先经过malloc和memset这两步操作

结构体数组

做个简单应用就好:输入4个学生的名字成绩,找出最高分。

#include <stdio.h>
#include <string.h>
#include <stdlib.h>struct student
{char* name; //char name[128];这种方法浪费空间  在linux环境下,一个指针只占用8个字节int score;
};int main()
{int i;struct student stu[4];for(i=0;i<4;i++){printf("请输入第%d个学生的名字\n",i+1);stu[i].name = (char* )malloc(sizeof(char)*16);memset(stu[i].name,0,sizeof(char)*16);scanf("%s",stu[i].name);printf("请输入他的成绩\n");scanf("%d",&stu[i].score);}struct student stuMax = stu[0];//就像正常的变量一样,可以相互赋值for(i=1;i<3;i++){if(stu[i].score > stuMax.score){stuMax = stu[i];}}printf("最高分是%s:%d\n",stuMax.name,stuMax.score);return 0;
}

结果:

请输入第1个学生的名字
喜羊羊
请输入他的成绩
90
请输入第2个学生的名字
懒羊羊
请输入他的成绩
60
请输入第3个学生的名字
美羊羊
请输入他的成绩
80
请输入第4个学生的名字
废羊羊
请输入他的成绩
30
最高分是喜羊羊:90
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17

跟结构体指针真的好像。

结构体指针(在指针中已有介绍)

结构体的综合运用👉学生成绩处理

因为呢结构体比较重要,搞个稍微复杂一点的练练手。

主要运用结构体指针,输入学生的学号,语文数学英语成绩。

要求封装功能函数(初始化学生成绩,找到分数最高的学生,算出班级平均分)。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>typedef struct student
{char* name;int chinese;int math;int english;int total;
}STU,*PSTU;   //typedef 为一种数据类型定义一个新名字PSTU initStu(int num)
{int i;//要想返回结构体指针,就要先创建并开创空间。PSTU p = (PSTU)malloc(sizeof(STU) * num);for(i=0;i<num;i++){printf("请输入第%d个学生的学号\n",i+1);p->name = (char* )malloc(16);//为字符指针开辟空间后才能赋值,否则就等着段错误吧。memset(p->name,0,16);        //在堆上面开辟空间,函数结束调用不会释放scanf("%s",p->name);printf("请分别输入语文,数学,英语成绩,以逗号隔开,以回车结束\n");scanf("%d,%d,%d",&p->chinese,&p->math,&p->english);p++;}return p-num;
}void print(PSTU stuSum,PSTU stuMax,int ave,int num)
{int i;PSTU p = stuSum;//这样不会导致stuSum指针偏移for(i=0;i<num;i++){printf("%s>>>>语文:%d,数学:%d,英语:%d\n\n",p->name,p->chinese,p->math,p->english);p++;}printf("总分最高分是%s:%d\n",stuMax->name,stuMax->total);printf("班级平均分是:%d\n",ave);//      free(p-num);
//      p = NULL;}PSTU findMax(PSTU stuSum,int num)
{int i;PSTU max = stuSum;PSTU p = stuSum;for(i=0;i<num;i++){if(p->total > max->total){max = p;}p++;}return max;
}void getTotalAndAve(PSTU stuSum,int num,int* ave)
{int i;int sum = 0;PSTU p = stuSum;for(i=0;i<num;i++){p->total = p->chinese + p->math + p->english;p++;}p -= num;for(i=0;i<num;i++){sum += p->total;p++;}*ave = sum / num;//      free(p-num);
//      p=NULL;}int main()
{int num;//学生人数int ave;//班级均分printf("需要录入几人的成绩?\n");scanf("%d",&num);PSTU stuSum = initStu(num);//初始化学生信息getTotalAndAve(stuSum,num,&ave);//计算各个学生的总分以及班级均分PSTU stuMax = findMax(stuSum,num);//找到总分最高的学生print(stuSum,stuMax,ave,num);//打印学生信息,最高分的人,班级均分return 0;
}

结果:

18001>>>>语文:90,数学:80,英语:70
18002>>>>语文:98,数学:9,英语:76 
18003>>>>语文:54,数学:89,英语:90
总分最高分是18001:240
班级平均分是:218
  • 1
  • 2
  • 3
  • 4
  • 5

小问题:不会释放指针,或者需不需要释放?

free(p);
p = NULL;
  • 1
  • 2

报错:释放了一个自由的地址?释放错了?

double free or corruption (!prev): 0x0017d848 ***
  • 1

可能是因为p++的影响,释放错了地址,于是

free(p-num);
p = NULL;
  • 1
  • 2

嘿嘿,还是不行,懂了再回来更新。我还是先注释掉吧。

结构体大小计算方法

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/266784.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

tp5更改入口文件到根目录的方法分享

tp5把入口文件放到了public目录中&#xff0c;对于服务器或者vps来说没啥&#xff0c;因为可以指定目录&#xff0c;但是对于虚拟主机就不行了&#xff0c;我们必须吧index.php这入口文件放到根目录&#xff0c;那么我么需要改一下相对的引入文件的路径就可以了&#xff0c;代码…

html 查找添加联系人,使用phonegap查找联系人的实现方法

实例如下&#xff1a;Database Exampledocument.addEventListener("deviceready", onDeviceReady, false);function onDeviceReady() {}function onSuccess(contacts){document.write(contacts.lengthcontacts found.);for(var i0;ifor(var j0;jdocument.write("…

实现连麦_微信年底放了个大招,视频号重磅升级,打赏直播连麦美颜抽奖齐上...

期待已久的视频号连麦功能来了。这次来的不仅有连麦功能&#xff0c;还有视频号打赏的微信豆体系&#xff0c;创作者想要的入口也有了。让我们一起来看看有什么新功能吧&#xff01;太长不看版本&#xff1a;「附近的人」变「附近的直播和人」连麦上线&#xff0c;还有美颜、抽…

【转】 .NET 打印水晶报表(CrystalReport)时,出现“查询引擎错误 C:/DO...

2019独角兽企业重金招聘Python工程师标准>>> 本地开发环境&#xff1a; Win XP, Visual Studio 2003 Oracle 项目背景&#xff1a; WinForm 工程&#xff0c;在一个表单中用Treeview控件显示 部门层级信息&#xff0c;然后有 按照相同格式&#xff08;layout…

洛谷 1226 取余运算||快速幂

洛谷 取余运算||快速幂 1226 其实比起楼下的大佬们&#xff0c;我主要是多了些位运算和讲解。 想法一&#xff1a; 直接输出 pow(b,q)%k 嗯~~勇气可嘉&#xff0c;但是看一眼数据范围&#xff08;长整型&#xff09;就会意识到&#xff0c;这个方法也许一个点都过不了。 想法二…

html5 查看图片,html5实现图片预览和查看原图

一、页面元素只有三个简单元素&#xff1a;拖拽区域二、添加简单的样式&#xff1a;.dragarea{width:300px;height:100px;background:#ddd;text-align:center;line-height:100px;}.drag_hover{background:rgba(0,0,0,.4) !important;}.item{width:300px;height:100px;float:lef…

五大板块(4)——链表

参考&#xff1a;五大板块&#xff08;4&#xff09;——链表 作者&#xff1a;丶PURSUING 发布时间&#xff1a; 2021-02-15 09:33:29 网址&#xff1a;https://blog.csdn.net/weixin_44742824/article/details/114981905 目录一、对比链表与数组同样是存放一串数据&#xff0…

boolean类型默认值_「软帝学院」Java的基本数据类型

Java的基本数据类型Java的两大数据类型: 内置数据类型 引用数据类型内置数据类型Java语言提供了八种基本类型。六种数字类型(四个整数型&#xff0c;两个浮点型)&#xff0c;一种字符类型&#xff0c;还有一种布尔型。byte&#xff1a; byte数据类型是8位、有符号的&#xff0c…

Quickly Find/ Open a file in Visual Studio

ctrl/, enter ">of " search item http://codeblog.shawson.co.uk/quickly-find-open-a-file-in-visual-studio/转载于:https://www.cnblogs.com/joe-yang/archive/2012/10/19/2731201.html

poj 3070

题面 大意就是求斐波那契数列第n项&#xff0c;做法为矩阵快速幂。 代码 #include<iostream> #include<cstdio> #include<cstring> #define LL long longusing namespace std; const int mod 10000; struct Mat{LL a[4][4];Mat(){memset(a,0,sizeof(a));}M…

计算机组装与维修预习,《计算机组装与维修》预习报告、实习报告撰写要求.docx...

《计算机组装与维修》预习报告、实习报告撰写要求本次《计算机组装与维修》课程的实验报告由两部分组成&#xff1a;预习报告和实习报告(总结)。其要求除了必须符合“《计算机组装与维修》课程考核标准及管理办法”外&#xff0c;强调要求预习报告要求每个参加实习的同学必须在…

Updating -- Linux小知识

没想到&#xff0c;10几年后又开始重拾这些曾经学习和使用过的知识&#xff0c;也许一切都是轮回&#xff0c;还好能捡起来。 1. 常用命令(参考 Linux 命令大全 | 菜鸟教程) #命令说明样例1whoami当前用户ID 2id当前用户ID 和 用户组IDid -un # 用户名 id -gn # 用户组…

五大板块(5)——字符串

参考&#xff1a;五大板块&#xff08;5&#xff09;——字符串 作者&#xff1a;丶PURSUING 发布时间&#xff1a; 2021-03-18 16:03:48 网址&#xff1a;https://blog.csdn.net/weixin_44742824/article/details/114982019 目录一、字符串的定义方式与输出二、字符串的结尾是…

潘多拉设置有线中继_避坑指南:购买无线中继器必看

房子太大&#xff0c;一台路由器容易覆盖不全&#xff0c;或者想蹭隔壁老王家的WiFi&#xff0c;这时候需要用到无线中继器。无线中继器主要作为无线路由器的补充产品&#xff0c;选得好就是锦上添花&#xff0c;选不好依旧是气到爆炸。所以&#xff0c;在购买无线中继器前&…

poj2154 Color ——Polya定理

题目&#xff1a;http://poj.org/problem?id2154 今天学了个高端的东西&#xff0c;Polya定理... 此题就是模板&#xff0c;然而还是写了好久好久... 具体看这个博客吧&#xff1a;https://blog.csdn.net/wsniyufang/article/details/6671122 代码如下&#xff1a; #include&l…

[转]sudoers设置

from http://www.cnblogs.com/zhuowei/archive/2009/04/13/1435190.htmlsudo与sudoerssudo 是linux下常用的允许普通用户使用超级用户权限的工具&#xff0c;允许系统管理员让普通用户执行一些或者全部的root命令&#xff0c;如halt&#xff0c;reboot&#xff0c;su等 等。这样…

哈尔滨阳光计算机学院是不是黄了,黑龙江这4所野鸡大学,常被误认为是名校,实则害人不浅...

在高考中拿到高分进入心仪的大学&#xff0c;几乎是所有高三党奋斗努力的目标。但并不是所有的考生都能得偿所愿&#xff0c;没有取得高分&#xff0c;想进入好大学&#xff0c;但是又不想复读再经历一次高三的磨砺。如果此时你收到了录取通知书或者电话&#xff0c;告知你被一…

android 打开支付宝扫码页_Chrome 85正式版发布:新增标签页分组功,网页多了也不乱...

IT服务圈儿有温度、有态度的IT自媒体平台文章转载自 OSCHINA 社区[http://www.oschina.net]原文标题&#xff1a;Chrome 85 稳定版发布&#xff0c;页面加载速度提升 10%谷歌今日发布了最新稳定版 Chrome 85。此版本将页面加载速度提高了 10%&#xff0c;并带来了许多标签页方面…

Windows使用技巧

摘自&#xff1a;这些技巧让你windows用起来很爽 —— 小工具&#xff0c;小技巧&#xff0c;删小广告&#xff0c;重装卸载残留 作者&#xff1a;丶PURSUING 发布时间&#xff1a; 2021-03-12 16:09:17 网址&#xff1a;https://blog.csdn.net/weixin_44742824/article/detail…

xunsearch安装使用

目录 1.下载2.进入&#xff0c;安装3.安装成功后&#xff0c;启动后台服务4.安装PHP-SDK安装步骤 1.下载 wget http://www.xunsearch.com/download/xunsearch-full-latest.tar.bz2 tar -xjf xunsearch-full-latest.tar.bz2 2.进入&#xff0c;安装 cd xunsearch-full-1.4.11/ s…