如果Data的地址是x,那么data[1][5].c的地址为()
A. x+195
B. x+365
C. x+368
D. x+245

2 收藏


直接登录
最新评论
  • exlsunshine 学生 2015/12/04

    D?
    16*15+5

  • D吧?
    对齐到16,16*10+16*5+1+4

  • 星满天下丶 C#开发 2015/12/04

    C,结构体内部要内存对齐,所以第一个char占4字节,第二个int占4字节,第三个占8字节,最后的char要使结构体总长度为结构体内最长字节的倍数,所以整个结构体要补位到24个字节,24*15+4+4=368

  • __TonyTonyChopper__   2015/12/04

    C…..24*5+8

  • __TonyTonyChopper__   2015/12/04

    呃,是 24*15+8=368

  • 王先生 学生 2015/12/04

    计算结构体的大小要考虑数据对其的问题,因为要考虑到CPU的运算速度最快的前提,
    在处理数据的时候把结构体变量中的成员按照4或8的倍数来计算,这是因为总线的宽
    度一般为4字节或者8字节。
    默认的字节对其的准则为:
    1.结构体变量的首地址能够被其最大的成员的大小整除。
    2.结构体的每个变量的成员相对于结构体的首地址的offset是成员大小的整数倍,
    这也是为什么一个char后面接一个int,那个char要被填充三个字节的原因,如
    果3个char一个int,则填充一个字节,在本题之中,int64_tc的偏移量要是8的
    整数倍
    3.结构体的总大小为结构体最大基本类型成员大小和编译器缺省对界条件大小中比
    较小的那个值的整数倍,如果有需要,会在最后一个成员之后加上填充字节。
    4.结构体作为成员时,则结构体成员要从其内部最大元素大小的整数倍地址开始存

    在本题中char a:4 int b:4 int64_t c 8 char d 8
    结构体总共24个字节,则data[1][5].c的地址为24*15+8=368

  • Whoops   2015/12/10

    “`c
    #include
    #include

    typedef struct {
    char a;
    int b;
    int64_t c;
    char d;
    } tmp;

    int main()
    {
    tmp t;
    printf(“sizeof: %d, %d, %d, %d\n”, sizeof(char), sizeof(int), sizeof(int64_t), sizeof(char));
    printf(“address in memory: %x, %x, %x, %x\n”, &t.a, &t.b, &t.c, &t.c);
    }
    “`

    “`bash
    $ ./a.out
    sizeof: 1, 4, 8, 1
    address in memory: fd257b40, fd257b44, fd257b48, fd257b48
    “`

    题主能解释一下吗?

    • 王先生 学生 2015/12/10

      等会回去看一看 可能你的编译器有问题

      • Whoops   2015/12/11

        怎么样?

        个人以为360这题出的不好。真要考基础就不应该出这种实现相关的。intel可能是这样,那arm呢?mips呢?

        • 王先生 学生 2015/12/11

          编译的话 和你的结果一样的,但按照完美C++primer上的说法这题就该这么做,可能不同的编译器的问题

        • 此去依然 C++程序狗 2015/12/12

          这和CPU架构无关,编译器不同,结果不同,你是可以指定内存对齐字节数的。不过这种题目也就是考考应届生的,不必深究。

  • BurnellLiu 程序员 2015/12/10

    为什么现在C/C++的笔试题还是这种脑残题目, C/C++标准不会变化? 编译器对齐的方式难道不会变化? int 永远只是4个字节?计算机是靠这种约定工作的? 如果这样要编译器手册和C/C++标准做什么.

  • BurnellLiu 程序员 2015/12/10

    高级语言的设计就是隐藏这种变化, 如果需要考虑这些, 直接写汇编得了