黑马程序员技术交流社区

标题: 结构体数组中元素字节问题? [打印本页]

作者: 远人    时间: 2014-3-29 17:12
标题: 结构体数组中元素字节问题?
本帖最后由 远人 于 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,这是为什么?
作者: agelessman    时间: 2014-3-29 17:50
这个不是像你那样理解的
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 17:54
本帖最后由 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. // 我以前也一直被这个问题困扰,这是我自己推敲验证出来的,希望能帮到您!
复制代码


作者: FlyTrem    时间: 2014-3-29 19:27
结构体占据的存储空间是结构体内最大成员的整数倍,也就是说如果结构体成员有int、double、char三个成员三种类型,成员最大占8字节空间,有3个成员,那么结构体占内存为8*3=24个字节。
作者: 远人    时间: 2014-3-29 19:35
Hi围城 发表于 2014-3-29 17:54

兄弟,你这个是正解,看了你得方法之后我又验证了,分别把结构元素改成
  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分技术分。
作者: 远人    时间: 2014-3-29 19:37
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;
复制代码


不过还是要感谢你了!
作者: agelessman    时间: 2014-3-29 21:09
远人 发表于 2014-3-29 19:37
兄弟,你得方法是错误的,你看看二楼吧,二楼是正解,或者你将结构变量改成如下,你再检验你得结果,就是 ...

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

同学,你的理解是错误的,你看看二楼的解释和我对一楼的回答!
作者: 2014571245    时间: 2014-4-1 23:38
恩 ,之前也对这个只是点不太明白,现在明白了!!!!谢谢了




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2