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

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

  • 相关阅读:
    路由器的配置
    逻辑卷
    valn配置
    交换分区和虚拟内存
    TCP和UDP
    语法练习1
    oracl通用函数
    AOP
    oracle查询操作
    Oracle中的转换函数
  • 原文地址:https://www.cnblogs.com/yangguang-it/p/8631000.html
Copyright © 2011-2022 走看看