穿黑衣服你是你,穿灰衣服你也还是你
#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
这个我在以前的随笔中有说过《结构体内存对齐深度剖析》
欢迎加入作者的小圈子
扫描下方左边二维码加入QQ交流群,扫描下方右边二维码关注个人微信公众号并获取更多隐藏干货,QQ交流群:816747642 微信公众号:Crystal软件学堂
![](https://images.cnblogs.com/cnblogs_com/yangguang-it/1907263/o_201227061707QQ20201227141844.png)
![](https://images.cnblogs.com/cnblogs_com/yangguang-it/1704156/o_200415115115qrcode_for_gh_5c7d1da35871_258.jpg)
作者:Crystal软件学堂 bilibili视频教程地址:https://space.bilibili.com/5782182 本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在转载文章页面给出原文连接。 如果你觉得文章对你有所帮助,烦请点个推荐,你的支持是我更文的动力。 文中若有错误,请您务必指出,感谢给予我建议并让我提高的你。 |