我有一个动态分配的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);
(如何正确释放内存不是问题)
答案 0 :(得分:4)
C标准保证
如果分配成功,则[malloc]返回指针 对齐,以便可以将其指定给指向任何类型对象的指针 然后用于访问此类对象或此类对象的数组 在分配的空间
在7.20.3“内存管理功能”[#1]
中因此,您的代码是安全的。
答案 1 :(得分:2)
OpenGroup将malloc定义为返回一个足够对齐任何类型的指针,包括double,所以它应该可以正常工作。
答案 2 :(得分:1)
初始的“uint8_t *”对分配的内存没有影响。一旦你有一个双指针的地址,你应该注意没有区别。