在不知道结构体实现的情况下,在C中创建结构体的静态实例

3

我有以下的头文件:

typedef struct my_data my_data_t;
my_data_t* new_my_data(void);
void free_my_data(my_data_t* my_data);

对应的C文件如下:

typedef struct my_data
{
  int val;
} my_data_t;

my_data_t* new_my_data()
{
  my_data_t* ptr = (my_data_t*)malloc(sizeof(my_data_t));
  return ptr;
}

void free_my_data(my_data_t* my_data)
{
  free(my_data);
}

我想在不使用malloc的情况下在静态内存中创建my_data_t的实例。我希望通过在头文件中添加以下内容来实现:

int sizeof_my_data(void);

把这些添加到c文件中:
int sizeof_my_data()
{
  return sizeof(my_data_t);
}

...并执行像这样的操作:

static my_data_t* my_data_instance = static_alloc(sizeof_my_data());

这个可以实现吗?我想这么做是因为目标机器上的代码是微处理器,不支持malloc(在我们的情况下,最好所有结构体都保存在静态内存中),而且我希望将my_data的实际数据结构隐藏起来,不让实现它的代码知道。如果有其他实现目标的建议也欢迎提供。谢谢。

2个回答

3
通常的做法是在您的头文件中创建一个正确大小的不透明结构体。例如:

#define MY_DATA_SIZE 32
struct my_data_t
{
    char opaque_data[MY_DATA_SIZE];
};

这是各种pthread数据类型(如pthread_mutex_t)的定义方式。


请注意,这种技术可能会遇到对齐问题,因为 char 只需要字节对齐,但更复杂的结构通常具有更强的对齐要求。 - Raymond Chen
非常好的观点,雷蒙德。现在我仔细看了一下,pthread类型被定义为一个char数组和另一个类型的联合体,该类型提供所需的对齐方式(例如long int)。 - Adam Rosenfield

2
如何在您的头文件中添加内容?
my_data_t *get_static_data();

并添加至您的C文件中

my_data_t *get_static_data()
{
    static my_data_t static_my_data;
    return &static_my_data;
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接