穿黑衣服你是你,穿灰衣服你也还是你

#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

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

原文地址:https://www.cnblogs.com/yangguang-it/p/8631000.html