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

时间:2013-09-09 08:57:02

标签: c++ c pointers

previous question我询问与按位操作有关的问题时,我被告知有一个代码访问带有char指针的int数组(用于操作更大的字节块)如果char数组未与int地址对齐,则可能会出现问题。

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

根据引用标准的SO中的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);

3 个答案:

答案 0 :(得分:6)

是的,C和C ++中的malloc和C ++中的new char[N]都返回一个最大对齐的指针。对齐是来自或。

max_align_t类型

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

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

答案 1 :(得分:1)

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

这很好,但更好的是:

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

或者,您可以使用C ++的operator new,如下所示:

void* p = operator new(16);
int* n = static_cast<int*>(p);

少一个static_cast

答案 2 :(得分:0)

malloc返回一个正确对齐C中任何基类型的地址。这意味着它可以安全地转换为所有类型的指针(int,长,double等等。