加载malloc分配的数组时发生访问冲突?

加载malloc分配的数组时发生访问冲突?,c,arrays,malloc,C,Arrays,Malloc,我有一个由malloc按以下方式分配的数组: double * a = ( double * ) malloc( lda * (k+1) * sizeof( double ) ); 其中,lda=1000和k是40的倍数 然后我尝试将a的值加载到以下代码中的寄存器中 reg = _mm_load_pd( (double *) & a[ (p*lda)+0 ]); 其中p是循环中受控的索引 此代码产生访问冲突错误 我知道要使用\u mm\u load\u pd数组必须是16字节对齐

我有一个由
malloc
按以下方式分配的数组:

double * a = ( double * ) malloc( lda * (k+1) * sizeof( double ) );  
其中,
lda=1000
k
是40的倍数

然后我尝试将
a
的值加载到以下代码中的寄存器中

reg = _mm_load_pd( (double *) & a[ (p*lda)+0 ]);
其中
p
是循环中受控的索引

此代码产生访问冲突错误

我知道要使用
\u mm\u load\u pd
数组必须是16字节对齐的。
malloc
是否已经进行了对齐?为什么会导致访问冲突错误?还有什么我可能遗漏的吗


谢谢。

malloc
通常只保证8字节对齐(双字节对齐)


如果你想要16字节对齐,你可以自己分配分配并适当调整指针,或者使用<代码> PosixyMaMeLIGG/<代码> /> AligNeDyMaLoC++ <代码>,根据你的平台获得必要的对齐。tag@Bot没有,你也可以在C++中使用<代码>(在某些情况下,这比新的更好,例如与某些C代码接口时)你如何释放分配的数据,因为不允许使用自由函数,因为它被删除函数取代了。我有点困惑,我的问题被否决了!我看到很多人在C++中使用MalC++!更多细节-谢谢答案。当代码< < < <代码> >操作符被用于C++动态分配时,对齐是如何完成的?我认为<代码>新< /Cord>也默认为8字节,但实际上我不确定。您可以使用C++中的“代码> STD::AlgNeNdIDSturaby<代码>来获得对齐内存,但是在C++ 03中,您基本上必须执行i。t您自己或使用前面提到的非标准C对齐的malloc函数。“malloc只保证8字节对齐”确信这是错误的。

malloc()
保证
sizeof(max\u align\t)
对齐可以小到1。不管它是什么,它都适用于平台。@chux:
malloc
必须返回一个指针,该指针必须对任何C对象具有足够的对齐,因为它没有进行类型检查。这意味着返回的内存必须是8字节对齐的,因为这是
double
的对齐要求。同意
 double
通常为8字节。不需要double的地址必须位于8字节对齐的地址上。其他属性(如总线宽度)有助于最小对齐。