zoukankan      html  css  js  c++  java
  • 穿黑衣服你是你,穿灰衣服你也还是你

    #include<stdio.h>
    
    struct st_t
    {
        int status;
        short *pdata;
        char errstr[32];
    };
    
    
    int main(void)
    {
    
        struct st_t st[16];
        char *p = (char *)(st[2].errstr + 32);
        printf("%d", (p - (char *)(st)));
        while (1)
        {
            ;
        }
        return 0;
    }

    这个主要让我们知道,不管你怎么变化,不变的是实质。

     其他不多说,主要是

    (p - (char *)(st))这个其实等价于st[3]的首地址(仅仅局限于这个特定题目,具体看下面的随堂测试),只是变了一个方式展示自己。
    32和64位中,指针一个四字节,一个8字节。

    X86:

    X64:

    如果你觉得你搞懂了,那么做个随堂测试吧:把32改成31

    #include<stdio.h>
    
    struct st_t
    {
        int status;
        short *pdata;
        char errstr[31];
    };
    
    
    int main(void)
    {
    
        struct st_t st[16];
        char *p = (char *)(st[2].errstr + 31);
        printf("%d", (p - (char *)(st)));
        while (1)
        {
            ;
        }
        return 0;
    }

    此时在X86和X64上应该输出多少?(答案在下方)

    Answer:

    默认8字节对齐时,X64:143  X86:119

    默认4字节对齐时,X64:131  X86:119

    这个我在以前的随笔中有说过《结构体内存对齐深度剖析》

  • 相关阅读:
    BZOJ2512 : Groc
    BZOJ3644 : 陶陶的旅行计划
    BZOJ1439 : YY的问题
    BZOJ2872 : 优莱卡
    BZOJ3273 : liars
    BZOJ4133 : Answer的排队
    URAL Palindromic Contest
    ZOJ Monthly, January 2018
    BZOJ2689 : 堡垒
    2017-2018 ACM-ICPC, Central Europe Regional Contest (CERC 17)
  • 原文地址:https://www.cnblogs.com/yangguang-it/p/8631000.html
Copyright © 2011-2022 走看看