黑马程序员技术交流社区

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

作者: Hi围城    时间: 2014-3-20 00:29
标题: 关于结构体中所占用字节数的问题
本帖最后由 Hi围城 于 2014-3-20 22:16 编辑

#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;
}
作者: 沙洲冷    时间: 2014-3-20 09:08
结构体所占的字节数等于其中各个成员所占字节数的总和,所以该结构体占(4+4+8=16)个字节,又因为你定义了一个包含三个元素的结构体数组,所以该结构体数组所占的字节数为:16×3=48,所以输出结果为48而非72。
作者: apple_victor    时间: 2014-3-20 12:41
=结构体长度求法:
基本原则:
•原则1、数据成员对齐规则:结构(struct或联合union)的数据成员,第一个数据成员放在offset为0的地方,以后每个数据成员存储的起始位置要从该成员大小的整数倍开始(比如int在32位机为4字节,则要从4的整数倍地址开始存储)。
•原则2、结构体作为成员:如果一个结构里有某些结构体成员,则结构体成员要从其内部最大元素大小的整数倍地址开始存储。(struct a里存有struct b,b里有char,int,double等元素,那b应该从8的整数倍开始存储。)
•原则3、收尾工作:结构体的总大小,也就是sizeof的结果,必须是其内部最大成员的整数倍,不足的要补齐。

作者: Hi围城    时间: 2014-3-20 16:13
沙洲冷 发表于 2014-3-20 09:08
结构体所占的字节数等于其中各个成员所占字节数的总和,所以该结构体占(4+4+8=16)个字节,又因为你定义了一 ...

#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;
}





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