#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
这个我在以前的随笔中有说过《结构体内存对齐深度剖析》