C---结构体
创始人
2024-01-28 12:24:04

目录

  • 结构体使用注意:
          • 1.给结构体中字符串赋值的写法
          • 2. 野指针和空间问题
  • 结构体数组应用之学生成绩最高分最低分
          • 注意:scanf不加&的情况:
  • 结构体指针
          • 结构体指针+函数实现学生成绩
  • 计算结构体的大小(面试)
          • 结构体对其计算方式
          • 计算结构体中套结构体的大小:
          • #pragma pack()

结构体使用注意:

1.给结构体中字符串赋值的写法
struct student test1;
test1.name = "小明"    //c++和Java中可以,C语言不行,必须通过strcpy赋值
strcpy(test.name,"小明");
2. 野指针和空间问题
struct datas
{
char *p;
}struct test
{
char p[128];
}int main()
{struct datas d;strcpy(d.p,"哈哈哈");printf("%s\n",d.p);
}
// 编译程序会崩溃,但是把main函数中的datas换成test就可以成功编译

原因是:test中定义的是数组,数组一旦被定义就自动生成空间,而datas中定义的是野指针,野指针必须要malloc。d.p=(char *)malloc(128),即使不初始化它,但至少它有空间了

结构体数组应用之学生成绩最高分最低分

#include 
#include struct student{int score;char *name;
};int main()
{int i;struct student stus[3];struct student max;struct student min;max = min = stus[i];for(i=0;i
注意:scanf不加&的情况:

接收的是一个地址的时候就不用&,例如stus[i].name那里。

结构体指针

1.如果用结构体指针,就不能用点运算符访问结构体中的变量,要用->
2.结构体指针的偏移问题:偏移整个结构体的大小

   struct student {int score;char name[128];   }
指针偏移一次,移动4+128=132个字节
结构体指针+函数实现学生成绩
#include 
#include struct student 
{int score;char *name;
};struct student *init(int len)
{int i;struct student *p =(struct student *)malloc(len*sizeof(struct student));//开辟len长度的空间来存放名字和分数for(i=0;iname = (char *)malloc(128);//指针所指向的地址需要存放数据的时候需要申请空间。scanf("%s",p->name);printf("请输入第%d个学生的分数:\n",i+1);scanf("%d",&(p->score));p++;               }return p-len;   //容易落下,不返回或只返回p都影响下一个函数的执行,//因为在该函数执行完后,指针已到了末尾,需要调回数组头的位置
}
void print(struct student *p,int len)
{int i;for(i=0;iname,p->score);p++;}
}struct student *max(struct student *p,int len)
{   //先遍历struct student *max = p; int i;for(i=0;iscore < p->score){max = p;          }       p++;}      printf("max %s:%d\n",max->name,max->score);return max;
}struct student *min(struct student *p,int len)
{struct student *min = p; int i;for(i=0;iscore > p->score){min = p;          }       p++;}      printf("min %s:%d\n",min->name,min->score);return min;}float average(struct student *p,int len)
{int i;int total = 0;for(i=0;iscore;p++;}printf("average:%f\n",(float)total/len);return (float)total/len;
}
int main()
{int len=0;int i;printf("人数:\n");scanf("%d",&len);struct student *ps = init(len); //定义个指针指向初始化函数,获取数组,len决定数组长度print(ps,len);max(ps,len);min(ps,len);average(ps,len);system("pause");return 0;
}

计算结构体的大小(面试)

结构体对其计算方式

两条原则:
1.结构体成员的偏移量必须是成员大小的整数倍
2.结构体大小必须是所有成员大小的整数倍(数组和结构体除外)

这种对齐方式很浪费空间,但是提高了计算机的访问效率

struct s1
{char b;  //1      {}   int c;   //4      {} {}{}{}  {}{}{}{}  char a;  //1      {} {}{}{}  {}{}{}{}  {}                   int d;   //4      {} {}{}{}  {}{}{}{}  {} {}{}{} {}{}{}{}char k;   //1     {} {}{}{}  {}{}{}{}  {} {}{}{} {}{}{}{} {}
}
实际的大小是20

b大小是1,不偏移,没有偏移值(因为他是头),此时字节数是1。
c大小是4,偏移值(原则1)为1+3=4(+3是对齐用的),加上它的大小4,此时字节数为1+3+4=8
a大小是1,大小是1,不需要对其,直接加,此时字节数为1+3+4+1 = 9
d大小是4,偏移值为1+3=4(+3是对齐用的),加上它的大小4,此时字节数为1+3+4+1 +3 +4 = 16
k大小是1,不需要对其,直接加,此时字节数为1+3+4+1 +3 +4 +1= 17

但是根据原则2,还需要补齐到20(int和char的整数倍)

计算结构体中套结构体的大小:
struct test
{char a;int b;struct test1{char  aa;int bb;}float c;
}

这种情况,计算test结构体的大小=1+3+4+4=12,不计算test1的大小,因为test1只是一个声明,不占空间,但如果test1是下面这种情况,就计算它的大小:

struct test1
{char  aa;int bb;
}stu;             (除了声明test1结构体还声明了stu这个变量)
#pragma pack()

对结构体对齐的方式进行限制
#pragma pack(4):限制跟4个字节对齐,如果结构体中最大的成员有超过4个字节的,就按4个字节对其;如果没超过,就按最大的成员大小算

相关内容

热门资讯

埃菲尔铁塔在哪 中国仿建埃菲尔... 2019年4月26日,广西南宁市,街头惊现一座巨型山寨版埃菲尔铁塔,高约20米,白色塔身,造型逼真,...
苗族的传统节日 贵州苗族节日有... 【岜沙苗族芦笙节】岜沙,苗语叫“分送”,距从江县城7.5公里,是世界上最崇拜树木并以树为神的枪手部落...
不用电脑怎么设置苹果铃声 ip... 需要一个app,加上苹果自带的app即可1、手机下载爱思极速版。因为之前换手机搬移数据时店员帮忙整理...
北京的名胜古迹 北京最著名的景... 北京从元代开始,逐渐走上帝国首都的道路,先是成为大辽朝五大首都之一的南京城,随着金灭辽,金代从海陵王...
应用未安装解决办法 平板应用未... ---IT小技术,每天Get一个小技能!一、前言描述苹果IPad2居然不能安装怎么办?与此IPad不...
长白山自助游攻略 吉林长白山游... 昨天介绍了西坡的景点详细请看链接:一个人的旅行,据说能看到长白山天池全凭运气,您的运气如何?今日介绍...
脚上的穴位图 脚面经络图对应的... 人体穴位作用图解大全更清晰直观的标注了各个人体穴位的作用,包括头部穴位图、胸部穴位图、背部穴位图、胳...
世界上最漂亮的人 世界上最漂亮... 此前在某网上,选出了全球265万颜值姣好的女性。从这些数量庞大的女性群体中,人们投票选出了心目中最美...
猫咪吃了塑料袋怎么办 猫咪误食... 你知道吗?塑料袋放久了会长猫哦!要说猫咪对塑料袋的喜爱程度完完全全可以媲美纸箱家里只要一有塑料袋的响...
埃菲尔铁塔在哪 中国仿建埃菲尔... 2019年4月26日,广西南宁市,街头惊现一座巨型山寨版埃菲尔铁塔,高约20米,白色塔身,造型逼真,...
苗族的传统节日 贵州苗族节日有... 【岜沙苗族芦笙节】岜沙,苗语叫“分送”,距从江县城7.5公里,是世界上最崇拜树木并以树为神的枪手部落...
才高八斗的主人公 三顾茅庐的主... 古代君王在建立自己的政治体系之时,大多会采取一些礼贤下士的手段,对于一些有卓越才能的人放低姿态。因为...
北京的名胜古迹 北京最著名的景... 北京从元代开始,逐渐走上帝国首都的道路,先是成为大辽朝五大首都之一的南京城,随着金灭辽,金代从海陵王...