结构混乱

  • 本文关键字:混乱 结构 c
  • 更新时间 :
  • 英文 :


考虑以下c代码:

#define MAX_PROP 16
struct property_setA {
u32 p1;
u32 p2;
};
struct property_setB {
u32 Pg;
};
struct objectA {
struct property_setA personal_properties [MAX_PROP];
struct property_setB global_property;
};

现在的任务是创建函数allocate_obj将给出一些固定的全局属性(例如32)并初始化其他个人属性的成员(例如p1,p2为0)我能够实现以下代码

struct objectA* allocate_obj() {
struct objectA *obj = (struct objectA*)malloc(sizeof(struct objectA);
// Assign global property
obj->global_property.Pg = 32;
// Initialize property_setA fields for this obj

return obj;
}

以下是我的疑问:

  1. personal_properties [MAX_PROP]是什么意思?我的意思是说,对于每个objectA,将有16个property_setA结构将被创建,或者我们必须选择第一个未使用的(16)索引。

  2. 如果我们要使用第一个未使用的,如何得到那个号码。我正在尝试以下for循环(内部allocate_obj()),但它给出错误。

    u32 i,pd;
    for(i=0;i<MAX_PROP;i++){
    if(obj->personal_properties[i] == NULL){     // This line give error
    pd = i;
    break;
    }
    }
    

那么如何获得第一个未使用的索引呢?

if(obj->property_setA[i] == NULL){     // This line give error

这一行给出了一个错误,因为一旦你索引数组,你没有一个指针(struct property_setA*),你可以比较NULL,你有一个实际的struct property_setA

你有两个选择:

  1. 将数组的声明改为指针数组:
struct objectA {
struct property_setA* personal_properties [MAX_PROP];
struct property_setB global_property;
};
// and then be sure to initialize them all to NULL:
struct objectA* allocate_obj() {
struct objectA *obj = (struct objectA*)malloc(sizeof(struct objectA);
memset(obj->personal_properties, 0, sizeof(struct property_setA*) * MAX_PROP);
// Assign global property
obj->property_setB.Pg = 32;
// Initialize property_setA fields for this obj
return obj;
}

请记住,在这种情况下,您必须现在mallocfree的基础对象设置/删除它们。

  1. 更简单的是,在你的结构中添加一个used计数器,并手动跟踪使用了多少属性:
struct objectA {
size_t used_properties;
struct property_setA personal_properties [MAX_PROP];
struct property_setB global_property;
};

初始化为0;下一个自由属性在那个索引处。当你设置一个属性,增加它(确保你不写超过MAX_PROP - 1)。

最新更新