加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c – malloc和new返回一个int对齐的地址吗?

发布时间:2020-12-16 09:47:21 所属栏目:百科 来源:网络整理
导读:在一个 previous question我询问与按位操作有关我被告知,如果char数组没有与int对齐,那么访问带有int指针的char数组的代码(一次操作更大块的字节)可能会有问题地址. 然后,在C中思考,我想知道当malloc为未知类型分配内存时会发生什么.例如,如果我执行void * p
在一个 previous question我询问与按位操作有关我被告知,如果char数组没有与int对齐,那么访问带有int指针的char数组的代码(一次操作更大块的字节)可能会有问题地址.

然后,在C中思考,我想知道当malloc为未知类型分配内存时会发生什么.例如,如果我执行void * p = malloc(sizeof(int));,我是否获得有效的char / int / long-aligned内存地址?

根据some answers这里引用标准,“返回的指针应适当对齐,以便它可以转换为任何完整对象类型的指针”.

因此,据我所知,在这种情况下,我可以从char *转到int *,没有任何问题:

char *p = malloc(16);
int *n = (int*)p; // use n a base of an array of 16 / sizeof(int) ints

这是对的吗?

转移到C,似乎是the same rule appears in the standard.那么,如果我这样做,我可以假设没有对齐风险吗?

char *p = new char[16];
int *n = reinterpret_cast<int*>(p);

解决方法

是的,C和C中的malloc以及C中的新char [N]都返回一个最大对齐的指针.对齐是来自或的类型max_align_t.

gcc-4.8在这方面有一个bug,修复了gcc-4.9.只需包含并使用:: maxalign_t而不使用std ::前缀.

支持过度对齐的类型,即其对齐大于上述最大值的类型,是实现定义的.例如. Posix提供posix_memalign来分配具有更大对齐的内存(例如,页面对齐).

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读