请教结构体的大小问题

xiximama 2010-06-18 05:24:48
1 #include <stdio.h>
2
3 int main(void)
4 {
5 struct test{
6 float f;
7 char p;
8 int adf[3];
9 } test;
10 printf("sizeof(test)=%d\n",sizeof(test));
11 printf("sizeof(float)=%d\n",sizeof(test.f));
12 printf("sizeof(char)=%d\n",sizeof(test.p));
13 printf("sizeof(int adf)=%d\n",sizeof(test.adf));
14 return 1;
15 }

输出结果:
sizeof(test)=20
sizeof(float)=4
sizeof(char)=1
sizeof(int adf)=12

为什么sizeof(test)的结果不是里面的几项的相加呢
...全文
112 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
vanchristin 2010-06-20
  • 打赏
  • 举报
回复
结构体成员对齐的问题
有几个原则
1.结构体起始地址必须整除最大成员的字节数(对齐量)
2.所有成员的起始地址都必须整除自己大小的字节数
3.如果某个成员的内存开始地址不能满足第2条,从能够满足第2条的第一个字节开始存储
4.结构体成员相对起始地址的偏移必须整除自己大小的字节数
5.结构体总的大小必须整除对齐量

不知道说完没有,还有,具体实现是跟编译器相关的
cai123321cai 2010-06-20
  • 打赏
  • 举报
回复
楼上的
3-(nVStartLength&3)+(nVStartLength&0xfc)
这个怎么理解?
nVStartLength&3
nVStartLength&0xfc
BullWeiHaiDong 2010-06-20
  • 打赏
  • 举报
回复
来受教来了,一直都没留意这问题
cffa_edfe 2010-06-20
  • 打赏
  • 举报
回复
内存对齐,像最大的成员对齐,每个都是sizeof(int),如果有个double,每个都是sizeof(double)
shangyangi 2010-06-19
  • 打赏
  • 举报
回复
受教了!
wujiaxuand 2010-06-19
  • 打赏
  • 举报
回复
内存对齐
  • 打赏
  • 举报
回复
printf("sizeof(int adf)=%d\n",sizeof(test.adf));//为什么adf没有退化成指针呢?如果退化成指针应该是4。。。。
poor_coder 2010-06-18
  • 打赏
  • 举报
回复
struct test{
float f;
char p;
int adf[3];
}

float占用4个字节
char占用1个字节
int类型默认需要4字节对齐,所以紧接char后,空出3个字节才开始是int,占用12字节。

所以总共是20字节。
cattycat 2010-06-18
  • 打赏
  • 举报
回复
google或百度 c++ 内存对齐
liutengfeigo 2010-06-18
  • 打赏
  • 举报
回复
VC调试时按Alt+8,TC或BC用TD调试,打开汇编窗口看每句C对应的汇编不就啥都明白了吗。
(Linux或Unix下应该也可以在用 GDB调试时,看每句C对应的汇编。)
qq34659713 2010-06-18
  • 打赏
  • 举报
回复
内存对齐,有4字节的就都会以4字节对齐,有2字节的都会以2字节对齐,但是若有4字节的同时有2个1字节的,你把1字节的放一起他们不会都从4倍数地址开始,所以写程序最好把大小一样的变量定义放一起
赵4老师 2010-06-18
  • 打赏
  • 举报
回复
VC调试时按Alt+8,TC或BC用TD调试,打开汇编窗口看每句C对应的汇编不就啥都明白了吗。
(Linux或Unix下应该也可以在用GDB调试时,看每句C对应的汇编。)
pengzhixi 2010-06-18
  • 打赏
  • 举报
回复
google内存对齐
michael122 2010-06-18
  • 打赏
  • 举报
回复
内存对齐问题
结果要是4的倍数
AlanBruce 2010-06-18
  • 打赏
  • 举报
回复
位域原则

中间的char也默认为4字节长度


所以一共20字节
bitxinhai 2010-06-18
  • 打赏
  • 举报
回复
内存对齐的问题

看样你的内存是4字节对齐的

最后的结果就是
比17大的能被4整除的整数
也就是20了
C++课程设计-单链表——学生信息管理系统全文共9页,当前为第1页。C++课程设计 单链表——学生信息管理系统 C++课程设计-单链表——学生信息管理系统全文共9页,当前为第1页。 学生信息管理系统设计文档 设计任务描述 为了实现学籍管理的简单化,我们基于Visual C++集成开发环境编写了"学生信息管理系统"软件,该软件适用于所有windows操作系统,面向广大用户,界面简洁,操作简单。此软件主要是实现对学生学籍信息进行系统化的管理,可以对学生基本信息进行添加、删除、查找、修改以及对学生成绩的管理,主要是根据学生的学号及其姓名进行操作的。该软件可以更加方便管理者管理学生学籍信息。 功能需求说明 该系统所需要的功能有:1、链表的建立; 2、学生信息的插入; 3、学生信息的查询; 4、学生信息的输出; 5、学生信息的修改; 6、学生信息的删除; 7、良好的欢迎选择界面。 三、总体方案设计 一、实现任务的方法 1、在欢迎选择界面中,使用Switch 这一选择结构来连接程序的执行和用户的命令; 2、在从学生信息的建立直到删除,都是使用链表的相关知识; 3、在定义学生信息时,建立一个Inform 类;在定义学生课程成绩时,自定义了一个achieve 结构体; 总体结构 C++课程设计-单链表——学生信息管理系统全文共9页,当前为第2页。 C++课程设计-单链表——学生信息管理系统全文共9页,当前为第2页。 三、模块划分 (1)链表的建立。 (2)对链表信息的插入。 (3)对链表信息的查找。 (4)对链表信息的输出。 (5)对链表信息的删除。 (6)对链表信息的修改。 课程成绩信息作为附加信息,穿插于各个模块中。 数据结构说明 一、自定义的数据结构: 1、achieve(课程成绩)用于存放课程成绩信息包括课程数、课程名、成绩、学分、总分和平均分。 2、inform(学生基本信息)用于存放学生基本信息,包括姓名、学号、性别等。 C++课程设计-单链表——学生信息管理系统全文共9页,当前为第3页。3、结点结构-Nodetype,定义了数据域inform和指针域next; C++课程设计-单链表——学生信息管理系统全文共9页,当前为第3页。 二、类 Student 用于存放处理学生信息的各个功能函数,private 成员是链表的头指针。 各模块设计说明 一、建立: 首先:建立一个空链表: Student::Student() {head=new Nodetype; head->next=NULL; 表明这是一个空链表 cout<<"请建立链表\n"; } C++课程设计-单链表——学生信息管理系统全文共9页,当前为第4页。然后建立链表: C++课程设计-单链表——学生信息管理系统全文共9页,当前为第4页。 二、添加:按照学号从小到大的顺序插入: 三、输出:将链表的数据输出,由于上述操作,输出时会按照学号从小到大的顺序输出。 四、查找:利用学号和姓名两种方式进行查找,查找时主要是遍历链表进行判断 while(p!=NULL&&(d==1&&strcmp(input,p->data.num)!=0)""(d==2&&strcmp(input,p->data.name)!=0)) {p=p->next; } //遍历链表查找符合要求的节点 五、删除:利用节点的删除操作,找到链表中第i-1个结点,修改其指向后继的指针: q = p->next; p->next = q->next; delete(q); 六、更改:利用查找的操作,查到后在进行重新输入的操作; 测试情况说明 C++课程设计-单链表——学生信息管理系统全文共9页,当前为第5页。测试一:学生信息的输入和输出都正常,但是查找、删除和修改时都只能对第一个数据进行操作,如下图所示: C++课程设计-单链表——学生信息管理系统全文共9页,当前为第5页。 但是当要进行查找、删除、修改操作时,系统只能对第一个对象进行操作 查看程序时,发现查找函数、删除和修改函数都有个逻辑错误 C++课程设计-单链表——学生信息管理系统全文共9页,当前为第6页。全部修改后,程序的上述错误就没再出现了。 C++课程设计-单链表——学生信息管理系统全文共9页,当前为第6页。 错误二:当提示是否输入课程成绩信息时,输入第一门课程名时,会出现无穷循环 但当输入第一门课程后就会出现下图所示状况: 对于这种状况,我百思不得其解,后来请教其他同学,他告诉我错误在于声明课程成绩信息时出错了 C++课程设计-单链表——学生信息管理系统全文共9页,当前为第7页。应该为二维数组,修改之后,课程成绩输入输出便正常了 C++课程设计-单链表——学生信息管理系统全文共9页,当前为第7页。 错误三:输入学生信息时不按照学号大小顺序,输出结果时也不

69,379

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧