c-分配内存并存储元数据



比方说,我想分配一块内存,并在该块前面存储一些元数据。为了做到这一点,我想出了这个:

#include <stdlib.h>
#include <stddef.h>
typedef struct metadata_s{
char someMetaData[3];
}metadata_t;
typedef struct mem_block_s{
metadata_t metadata;
//Insert padding so 'data' has fundamental alignment
char padding[sizeof(max_align_t) == sizeof(metadata_t) ? 0 : sizeof(max_align_t) - (sizeof(metadata_t)) % sizeof(max_align_t)];
char data[];
}mem_block_t;
void* allocateMemory(size_t size){
mem_block_t* newMemBlock = malloc(sizeof(mem_block_t) + size);
if(newMemBlock != NULL){
return(newMemBlock->data);
}
return(NULL);
}
int main(void){
double* doubleArray = allocateMemory(100 * sizeof(double));
if(doubleArray != NULL){
doubleArray[0] = 1.0f;
}
}

这有多个问题:

  • C只保证在结构的开头没有填充,mem_block_s结构内部可能有额外的填充
  • 最终,我返回一个指向char数组的指针,并将其分配给(在本例中(一个double指针(允许我这样做吗?(

相反,我可以做一些类似的事情

typedef struct mem_block_s{
metadata_t metadata;
void* data;
}mem_block_t;

并分别为data分配内存,但如果只给定data指针,我将很难访问元数据。

做这样的事情,正确的C方法是什么?

作为一个专门的gcc用户,我会使用零并集和零大小的数组。

typedef struct metadata_s{
char someMetaData[3];
}metadata_t;
typedef union
{
char c[0];
unsigned char uc[0];
/* ... */
double dbl[0];
}DATA_t;
typedef struct mem_block_s{
metadata_t metadata;
//Insert padding so 'data' has fundamental alignment
DATA_t data[];
}mem_block_t;
void* allocateMemory(size_t size){
mem_block_t* newMemBlock = malloc(sizeof(mem_block_t) + size);
if(newMemBlock != NULL){
return(newMemBlock->data);
}
return(NULL);
}
int main(void){
DATA_t* doubleArray = allocateMemory(100 * sizeof(double));
if(doubleArray != NULL){
doubleArray -> dbl[0] = 1.0f;
}
}

但我知道这不是很便携——使用可能不会起作用

最新更新