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

时间:2018-02-06 12:20:02   浏览:次   点击:次   作者:   来源:   立即下载

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

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

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

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

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

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\"的地址。

回答完毕。

收起

相关推荐

相关应用

平均评分 0人
  • 5星
  • 4星
  • 3星
  • 2星
  • 1星
用户评分:
发表评论

评论

  • 暂无评论信息