考虑以下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;
}
以下是我的疑问:
personal_properties [MAX_PROP]是什么意思?我的意思是说,对于每个objectA,将有16个property_setA结构将被创建,或者我们必须选择第一个未使用的(16)索引。
如果我们要使用第一个未使用的,如何得到那个号码。我正在尝试以下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
。
你有两个选择:
- 将数组的声明改为指针数组:
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;
}
请记住,在这种情况下,您必须现在malloc
和free
的基础对象设置/删除它们。
- 更简单的是,在你的结构中添加一个
used
计数器,并手动跟踪使用了多少属性:
struct objectA {
size_t used_properties;
struct property_setA personal_properties [MAX_PROP];
struct property_setB global_property;
};
初始化为0;下一个自由属性在那个索引处。当你设置一个属性,增加它(确保你不写超过MAX_PROP - 1)。