我动态分配了一个uint8_t内存数组
uint8_t* array = malloc( sizeof( double ) * 100 );
我想将双精度存储到内存中。这是否被视为定义的行为,或者我必须担心一些对齐问题?
double* d = ( void* )array ;
for( int i = 0 ; i < 100 ; i++ )
d[i] = 3.1415 ; //any double will do here
d
的行为应该相同,就好像我只是将 d 分配为 :
double* d = malloc( sizeof( double ) * 100 );
另外,如果我更改指针数组以进一步指向内存,如下所示:
double* d = ( void* )(array + sizeof( double ) * 50 ) ;
for( int i = 0 ; i < 50; i++ )
d[i] = 3.1415 ; //any double will do here
d
的行为是否与
double* d = malloc( sizeof( double ) * 50);
(如何正确释放内存不是这里的问题)
C 标准保证
如果分配成功,则返回 [malloc] 的指针是合适的 对齐,以便可以将其分配给指向任何类型的对象的指针 然后用于访问此类对象或此类对象的数组 在分配的空间中
在 7.20.3 "内存管理功能" [#1] 中
因此,您的代码是安全的。
OpenGroup 将 malloc 定义为返回一个对任何类型都充分对齐的指针,双包含,因此它应该可以正常工作。
最初的"uint8_t *"对分配的内存没有影响。将地址放在双指针中后,您应该不会注意到任何区别。