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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© Hi围城 中级黑马   /  2014-3-18 14:49  /  4755 人查看  /  9 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 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;
}

评分

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

查看全部评分

9 个回复

倒序浏览
本帖最后由 董月峰 于 2014-3-18 17:05 编辑

对齐取整,而不是和取整【老师视频讲过的】
结构体所占字节是最大成员所占字节的倍数,楼主的结构体里最长的是8,然后有3个元素,即8*3=24个字节。
所以下面那个是24*3【数组每个结构体成员的长度都是24,也就是本来就是齐的】=72

评分

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

查看全部评分

回复 使用道具 举报
对齐 字节数应该是最大字节的倍数
struck student
{
    int age;
    char *name;
}stu;
c=sizeof(stu);// 感觉可能是4+8=12 但必须是指针类型的倍数,所以应该是16字节
回复 使用道具 举报
=结构体长度求法:
基本原则:
•原则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

评分

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

查看全部评分

回复 使用道具 举报
董月峰 发表于 2014-3-18 15:14
对齐取整,而不是和取整
结构体所占字节是最大成员所占字节的倍数,即8*3=24个字节。
所以下面那个是24*3=7 ...

哦,数组也是对齐取整吗?
回复 使用道具 举报
77媛儿 发表于 2014-3-18 15:37
对齐 字节数应该是最大字节的倍数
struck student
{

16字节不对的啊?
回复 使用道具 举报
apple_victor 发表于 2014-3-18 16:39
=结构体长度求法:
基本原则:
•原则1、数据成员对齐规则:结构(struct或联合union)的数据成员,第一个 ...

请问数组的长度求法同结构体吗?
回复 使用道具 举报
Hi围城 发表于 2014-3-18 16:49
哦,数组也是对齐取整吗?

数组的时候他们长度都相同,也就是不用对齐本来就是齐的
回复 使用道具 举报
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;
}
回复 使用道具 举报
董月峰 发表于 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;
}
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马