首页 > 解决方案 > 如何根据 C 中的另一个成员定义具有变量成员的结构?

问题描述

我在 C 中有一个结构:

typedef struct storing_fields
{
  int x;
  int y;
  int z;
};

在某些情况下,基于 的某个值x,我不需要yz,但也有一些情况下我都需要它们。

我的问题是:

标签: cobjectstructurestorage

解决方案


内存方面的常见做法是将size参数保留为结构的第一个成员,这样您可以快速有效地迭代元素。

您可以将成员保留在结构声明中,malloc但是您需要的字节数。但是您也可以声明几种类型的结构,但将它们的数组声明为统一类型,如下所示:

typedef struct storing_fields_full
{
  size_t size;
  int x,y,z;
} storing_fields_full;

typedef struct storing_fields3
{
  size_t size;
  int x,y,z;
} storing_fields3;


typedef struct storing_fields2
{
  size_t size;
  int x,y;
} storing_fields2;


typedef struct storing_fields1
{
  size_t size;
  int x;
} storing_fields1;

确保size成员始终等于sizeof(storing_fieldsx)并且您的成员始终处于相同的顺序。如果您在数组中“混合”了不同的类型,则可以像这样有效地迭代它们:

int i;
storing_fields_full *data;
for (i=0, data=some_data; i<num_elements; i++, data+=data->size)
{
   // do stuff with your data here
}

假设您始终知道结构中实际存在或不存在哪种数据,那么您应该很高兴。否则,您总是可以像这样测试它:

if (data->size > offsetof(storing_fields_full,z)) // data is present

请注意,在提供的确切示例中,这并没有节省太多内存,因为size参数的开销实际上可能会增加内存大小,但如果您计划使用的结构更大,它可能会节省大量内存。对于较小的结构,例如示例中的结构,只保留未使用的成员可能会提高迭代速度,并且也更容易从代码中进行管理。


推荐阅读