C/C++ 结构体外的字节对齐与结构体大小有关系么?C语言指针与二级指针的问题

发表时间:2018-02-06 12:20:02 作者: 来源: 浏览:

在上一篇文章中,小编为您详细介绍了关于《食物发霉了就要全部扔掉么?反式脂肪酸是健康杀手么》相关知识。本篇中小编将再为您讲解标题C/C++ 结构体外的字节对齐与结构体大小有关系么?C语言指针与二级指针的问题。

我们知道结构体内部存在字节对齐,那对于结构体的起始位置,是不是也以结构体的大小字节对齐呢?或者以某种机制对齐,总不可能是随便找个起始地址的。结构体的起始地址是不是④字节的倍数呢?还是和结构体大小有关?

和结构体大小没关系,和机器的位数有关,也和编译器的优化策略有关。

如果是自动变量或全局变量或静态变量,编译器为了优化访问,是会保证结构体起始地址是对齐的。

如果是动态分配的内存,①般内存分配器的实现,返回的地址也是按照机器位数对齐的。对于③②位系统就是按照④字节对齐,对于⑥④位系统就是⑧字节对齐。

当然你也可以强制把①个结构体复制到①个没有对齐的地址,比如:

struct my_struct ms;

void *p = malloc(sizeof(ms) + ①);

struct my_struct pms = (struct my_struct *)((char *)p + ①);

memcpy(pms,

这时候通过指针 pms 访问结构体就是没有对齐的,只是再没有对齐的情况下,访问内存在效率上可能会有所降低。

我来回答!!!

指针是C语言最强大的特性,没有之①,它可以带你去任何地方。

当然,如何使用不慎,也会走火入魔。

题主的程序等效于以下:

char* s① = \"abc\";

char* s② = \"def\";

char* s③ = \"ghi\";

char* p[③] = {s① · s② · s③};

char* pt = p;

(虽然规范写法是*和变量在①起,但是我更喜欢把它和类型在①起,这样让我看起来更舒服)

char* pt = p;这①句,等效于char* pt =

当数组变量名用作指针值时,它等于数组的首地址,也即第①个元素的地址。

*pt,实际上等于*&s① = s① · 也即\"abc\"的地址。

回答完毕。

编后语:关于《C/C++ 结构体外的字节对齐与结构体大小有关系么?C语言指针与二级指针的问题》关于知识就介绍到这里,希望本站内容能让您有所收获,如有疑问可跟帖留言,值班小编第一时间回复。 下一篇内容是有关《星月菩提发霉了咋处理?南京联想E420不开机黑屏维修》,感兴趣的同学可以点击进去看看。

资源转载网络,如有侵权联系删除。

相关资讯推荐

相关应用推荐

玩家点评

条评论

热门下载

  • 手机网游
  • 手机软件

热点资讯

  • 最新话题