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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 程序猿-2014 中级黑马   /  2014-4-11 20:52  /  1479 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 程序猿-2014 于 2014-4-13 23:29 编辑

#include <stdio.h>
int main()
{

    struct rankRecord {
        int number;
        
        char *name;
        
        int score;
    };
    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));
   
    return 0;
}
如题:  输出结果应该是48阿,为什么输出的是72?今天复习时这个程序半天没看懂为什么?求解

评分

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

查看全部评分

4 个回复

倒序浏览
因为你用到了指针:  char *name; 而指针在内存中占八个字节,在结构体数组中根据对齐算法,即在程序运行时分配内存空间默认按照以指针的占内存空间大小分配内存空间,所以输出字节数为72
回复 使用道具 举报
  1. #include <stdio.h>
  2. int main()
  3. {
  4.     struct rankRecord {
  5.         int number;
  6.         char *name;
  7.         int score;
  8.     };
  9.     struct rankRecord records[3] = {
  10.         {1, "jack", 5000},
  11.         {2, "jim", 500},
  12.         {3, "jake", 300}
  13.     };
  14.     records[2].score = 3000;
  15.     printf("%d\n", records[2].score);
  16.     printf("%lu\n", sizeof(records));
  17.     printf("%lu\n", sizeof(records[0].number));
  18.     printf("%lu\n", sizeof(records[1].name));
  19.     printf("%lu\n", sizeof(records[2].score));
  20.     return 0;
  21. }
复制代码


结果:
3000
72
4
8
4

添几句代码,可以清楚的看到每个结构体成员所占的字节数,再根据结构体的对齐和补齐原则,就不难得出结果了。
回复 使用道具 举报
本帖最后由 董月峰 于 2014-4-13 13:35 编辑
heima-王鹏 发表于 2014-4-12 22:44
因为你用到了指针:  char *name; 而指针在内存中占八个字节,在结构体数组中根据对齐算法,即在程序运行时 ...
// 楼主,把char *name;放最前面就是48了
#include <stdio.h>
int main()
{
    struct rankRecord {
        char *name;
        int number;

        int score;
    };
    struct rankRecord records[3] = {
        {"jack", 1, 5000},
        {"jim", 2, 500},
        {"jake", 3, 300}
    };
    records[2].score = 3000;
    printf("%d\n", records[2].score);
    printf("%lu\n", sizeof(records));
    printf("%lu\n", sizeof(records[0].name));
    printf("%lu\n", sizeof(records[1].number));
    printf("%lu\n", sizeof(records[2].score));
    return 0;
}

输出结果:

3000
48
8
4
4

Program ended with exit code: 0

回复 使用道具 举报
int 首先占用了4个 ,假设00000后边的char *要占8个,但是他在内存中占得位置应该是00008后边的int占4个冲00016开始 所以一共占了8+8+4=20 ,其中要是8的倍数所以他的总存储字节就是24,乘以3等于72
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马