黑马程序员技术交流社区

标题: 关于结构体数组所占字节数的问题 [打印本页]

作者: Hi围城    时间: 2014-3-18 14:49
标题: 关于结构体数组所占字节数的问题
本帖最后由 Hi围城 于 2014-3-20 22:17 编辑

#include <stdio.h>
int main()
{
    // 结构体数组
    struct rankRecord {
        int number; // 4个字节
        
        char *name; // 8个字节
        
        int score; // 4个字节,结构体所占字节是最大成员所占字节的倍数,即16个字节。
    };
    struct rankRecord records[3] = {
        {1, "jack", 5000},
        {2, "jim", 500},
        {3, "jake", 300}
    };
    records[2].score = 3000;
   
    printf("%d\n", records[2].score);
   
    printf("%lu\n", sizeof(records)); // 输出结果应该是48阿,为什么输出的是72?
   
    return 0;
}
作者: 董月峰    时间: 2014-3-18 15:14
本帖最后由 董月峰 于 2014-3-18 17:05 编辑

对齐取整,而不是和取整【老师视频讲过的】
结构体所占字节是最大成员所占字节的倍数,楼主的结构体里最长的是8,然后有3个元素,即8*3=24个字节。
所以下面那个是24*3【数组每个结构体成员的长度都是24,也就是本来就是齐的】=72
作者: 77媛儿    时间: 2014-3-18 15:37
对齐 字节数应该是最大字节的倍数
struck student
{
    int age;
    char *name;
}stu;
c=sizeof(stu);// 感觉可能是4+8=12 但必须是指针类型的倍数,所以应该是16字节
作者: apple_victor    时间: 2014-3-18 16:39
=结构体长度求法:
基本原则:
•原则1、数据成员对齐规则:结构(struct或联合union)的数据成员,第一个数据成员放在offset为0的地方,以后每个数据成员存储的起始位置要从该成员大小的整数倍开始(比如int在32位机为4字节,则要从4的整数倍地址开始存储)。
•原则2、结构体作为成员:如果一个结构里有某些结构体成员,则结构体成员要从其内部最大元素大小的整数倍地址开始存储。(struct a里存有struct b,b里有char,int,double等元素,那b应该从8的整数倍开始存储。)
•原则3、收尾工作:结构体的总大小,也就是sizeof的结果,必须是其内部最大成员的整数倍,不足的要补齐。
====
所以:
该题结构体的长度应该取内部最大成员的整数倍,即为:8*3*3=72

作者: Hi围城    时间: 2014-3-18 16:49
董月峰 发表于 2014-3-18 15:14
对齐取整,而不是和取整
结构体所占字节是最大成员所占字节的倍数,即8*3=24个字节。
所以下面那个是24*3=7 ...

哦,数组也是对齐取整吗?
作者: Hi围城    时间: 2014-3-18 16:50
77媛儿 发表于 2014-3-18 15:37
对齐 字节数应该是最大字节的倍数
struck student
{

16字节不对的啊?
作者: Hi围城    时间: 2014-3-18 16:57
apple_victor 发表于 2014-3-18 16:39
=结构体长度求法:
基本原则:
•原则1、数据成员对齐规则:结构(struct或联合union)的数据成员,第一个 ...

请问数组的长度求法同结构体吗?
作者: 董月峰    时间: 2014-3-18 17:03
Hi围城 发表于 2014-3-18 16:49
哦,数组也是对齐取整吗?

数组的时候他们长度都相同,也就是不用对齐本来就是齐的
作者: Hi围城    时间: 2014-3-18 17:13
apple_victor 发表于 2014-3-18 16:39
=结构体长度求法:
基本原则:
•原则1、数据成员对齐规则:结构(struct或联合union)的数据成员,第一个 ...

#include <stdio.h>
// 本题中输出的为什么是48而不是72个字节?
int main()
{
     struct Student
     {
     int age;// 4
     int score;// 4
     
     char *name;//8
     };
     
     struct Student stus[3];
     
     
     printf("%ld\n", sizeof(stus));
   
    return 0;
}
作者: Hi围城    时间: 2014-3-18 17:16
董月峰 发表于 2014-3-18 15:14
对齐取整,而不是和取整【老师视频讲过的】
结构体所占字节是最大成员所占字节的倍数,楼主的结构体里最长 ...

#include <stdio.h>
// 本题中输出的为什么是48而不是72个字节?
int main()
{
     struct Student
     {
     int age;// 4
     int score;// 4
     
     char *name;//8
     };
     
     struct Student stus[3];
     
     
     printf("%ld\n", sizeof(stus));
   
    return 0;
}




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