A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 远人 中级黑马   /  2014-3-29 17:12  /  2031 人查看  /  8 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 远人 于 2014-3-29 17:13 编辑

这是老师讲关于结构体数组的问题。
  1. #include <stdio.h>
  2. int main(int argc, const char * argv[])
  3. {
  4.     struct RankRecord
  5.     {
  6.         int no;//4 个字节
  7.         char *name;//8 个字节
  8.         int score;//4 个字节
  9.     };
  10. struct RankRecord records[3]=
  11.     {
  12.         {1,"jack",5000},
  13.         {2,"jim",500},
  14.         {3,"jake",300}
  15.     };printf("size=%d\n",sizeof(records[1]));
  16.     return 0;
  17. }
复制代码

按照老师讲得对齐法则和其他知识,三个数组元素相加是16个字节,根据对齐算法,16是8得倍数,那么这里的输出结果应该是size=16,但是结果是24,这是为什么?

评分

参与人数 1技术分 +1 收起 理由
jing迪 + 1

查看全部评分

8 个回复

倒序浏览
这个不是像你那样理解的
int no;//4 个字节
char *name;//8 个字节
int score;//4 个字节
这里边最大的是char 8这个你知道的,它在内存中就以8的倍数,根据对其法则 int要补齐到8
举个例子
int     1 1 1 1                                 int  1 1 1 1 *  *  * *
char  1 1 1 1 1 1 1 1        对齐后  char1 1 1 1 1 1 1 1是这样的
int     1 1 1 1                                 int  1 1 1 1 *  *  *  *
回复 使用道具 举报
本帖最后由 Hi围城 于 2014-3-29 18:40 编辑
  1. #include <stdio.h>
  2. int main(int argc, const char * argv[])
  3. {
  4.     struct RankRecord
  5.     {
  6.         // int 4个字节
  7.         int no;
  8.         // char * 8个字节
  9.         char *name;
  10.         // int 4个字节
  11.         int score;
  12.         // 我加的一个元素,注意现在多了一个元素,用在我的结尾结论中
  13.         int a;
  14.     };
  15.     struct RankRecord records[3]=
  16.     {
  17.         {1,"jack",5000},
  18.         {2,"jim",500},
  19.         {3,"jake",300}
  20.     };printf("size=%d\n",sizeof(records[1]));
  21.     return 0;
  22. }
  23. // 所占字节分析(补齐算法):结构体中的第一个元素它的下一个元素相比所占字节数为其倍数,不足的在中间补齐(4+4+8=16);当执行到结构体中的末尾元素时,就会分析所占字节是否为元素的所占字节最大的那个变量的倍数(16+4)% 8 == 0 ? '和' :’倍数'。其中为真就返回所有成员字节数的和,为假就补齐直到能整除8,所以这里返回的是24。
  24. // 我在你的结构体变量中再加了个int a,结果还是24,掌握了方法,一切都在掌握中。
  25. // 我以前也一直被这个问题困扰,这是我自己推敲验证出来的,希望能帮到您!
复制代码

评分

参与人数 1技术分 +1 收起 理由
jing迪 + 1

查看全部评分

回复 使用道具 举报
结构体占据的存储空间是结构体内最大成员的整数倍,也就是说如果结构体成员有int、double、char三个成员三种类型,成员最大占8字节空间,有3个成员,那么结构体占内存为8*3=24个字节。
回复 使用道具 举报

兄弟,你这个是正解,看了你得方法之后我又验证了,分别把结构元素改成
  1. // int 4个字节
  2.         double no;
  3.         // char * 8个字节
  4.         char *name;
  5.         // int 4个字节
  6.         int score;
  7.         // 我加的一个元素,注意现在多了一个元素,用在我的结尾结论中
  8.         char a;
复制代码

验证,还添加了元素验证
  1. // int 4个字节
  2.         double no;
  3.         // char * 8个字节
  4.         char *name;
  5.         // int 4个字节
  6.         int score;
  7.         // 我加的一个元素,注意现在多了一个元素,用在我的结尾结论中
  8.         char a;
  9.         
  10.         char *game;
复制代码

检验的结果真心是你这样的,哈哈,建议版主给这位兄弟3分技术分。
回复 使用道具 举报
agelessman 发表于 2014-3-29 17:50
这个不是像你那样理解的
int no;//4 个字节
char *name;//8 个字节

兄弟,你得方法是错误的,你看看二楼吧,二楼是正解,或者你将结构变量改成如下,你再检验你得结果,就是错误的
  1. // int 4个字节
  2.         double no;
  3.         // char * 8个字节
  4.         char *name;
  5.         // int 4个字节
  6.         int score;
  7.         // 我加的一个元素,注意现在多了一个元素,用在我的结尾结论中
  8.         char a;
  9.         
  10.         char *game;
复制代码


不过还是要感谢你了!
回复 使用道具 举报
远人 发表于 2014-3-29 19:37
兄弟,你得方法是错误的,你看看二楼吧,二楼是正解,或者你将结构变量改成如下,你再检验你得结果,就是 ...

是的,我理解错了 ,还好你提醒,多谢,要不还不知道错到什么时候
回复 使用道具 举报
远人 中级黑马 2014-3-30 10:07:28
8#
FlyTrem 发表于 2014-3-29 19:27
结构体占据的存储空间是结构体内最大成员的整数倍,也就是说如果结构体成员有int、double、char三个成员三 ...

同学,你的理解是错误的,你看看二楼的解释和我对一楼的回答!
回复 使用道具 举报
恩 ,之前也对这个只是点不太明白,现在明白了!!!!谢谢了
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马