您的位置:首页 > 其它

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

2018-03-23 16:22 120 查看
#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

这个我在以前的随笔中有说过《结构体内存对齐深度剖析》
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: