c - 如何根据 C 中的另一个成员定义具有变量成员的结构?
问题描述
我在 C 中有一个结构:
typedef struct storing_fields
{
int x;
int y;
int z;
};
在某些情况下,基于 的某个值x
,我不需要y
和z
,但也有一些情况下我都需要它们。
我的问题是:
- 如何根据 C 中的另一个成员定义具有变量成员的结构?
解决方案
内存方面的常见做法是将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
参数的开销实际上可能会增加内存大小,但如果您计划使用的结构更大,它可能会节省大量内存。对于较小的结构,例如示例中的结构,只保留未使用的成员可能会提高迭代速度,并且也更容易从代码中进行管理。
推荐阅读
- c - Linux/POSIX:timer_settime - 无法从定时器生成的线程中解除定时器
- r - 用新值替换列中的多个值
- ionic-framework - 不同幻灯片中的不同列表同时滚动
- jquery - 在按钮单击时使用 ajax 调用数据在第二次单击时不能在同一个按钮上工作
- java - Swagger codegen 生成重复变量
- arrays - 从 VBA 函数返回数组的正确方法
- jmeter - jMeter:将多行从 CSV 文件加载到 HTTP 正文中
- google-apps-script - 如何使用谷歌应用脚本制作自定义验证函数,如 requireTextMatchesPattern(pattern) 函数?
- azure - Azure Logic Apps/Data Factory,使用 FTPS 获取文件
- php - 无法使用 morris.js 读取未定义的属性“x”