3

上一个与按位运算相关的问题中,有人告诉我,如果数组未与地址对齐,则使用指针访问char数组的代码int(一次操作更大的字节块)可能会出现问题。charint

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

根据引用标准的SO中的一些答案,“返回的指针应适当对齐,以便它可以转换为任何完整对象类型的指针”。

因此,我知道在这种情况下我可以毫无问题地从char*到:int*

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

这是对的吗?

转向 C++,似乎相同的规则出现在标准. 那么,如果我这样做,我可以假设没有对齐风险吗?

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

3 回答 3

6

是的,malloc在 C 和 C++ 中以及new char[N]在 C++ 中都返回一个最大对齐的指针。对齐是max_align_t来自 or 的类型。

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

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

于 2013-09-09T08:58:50.807 回答
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

于 2013-09-09T09:06:31.827 回答
0

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

于 2013-09-09T08:59:00.497 回答