使用uint8_t为双数组分配内存

时间:2013-12-31 20:17:28

标签: c pointers casting malloc

我有一个动态分配的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);

(如何正确释放内存不是问题)

3 个答案:

答案 0 :(得分:4)

C标准保证

  

如果分配成功,则[malloc]返回指针   对齐,以便可以将其指定给指向任何类型对象的指针   然后用于访问此类对象或此类对象的数组   在分配的空间

在7.20.3“内存管理功能”[#1]

因此,您的代码是安全的。

答案 1 :(得分:2)

OpenGroup将malloc定义为返回一个足够对齐任何类型的指针,包括double,所以它应该可以正常工作。

答案 2 :(得分:1)

初始的“uint8_t *”对分配的内存没有影响。一旦你有一个双指针的地址,你应该注意没有区别。