在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);
答案 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
等等。