C语言结构体定义疑惑及allocate_obj函数初始化实现问题
问题解答
疑问1:personal_properties [MAX_PROP] 的含义
personal_properties[MAX_PROP] 是结构体objectA内置的、长度为16的property_setA类型数组。每个objectA实例被创建时,会直接在自身内存空间中分配16个连续的property_setA结构体实例,不需要额外为这部分申请内存。
这个数组本身没有内置“已使用/未使用”的标记逻辑,如果你需要区分哪些索引正在被使用,需要自行约定判断规则。
疑问2:报错原因及获取第一个未使用索引的方案
你写的判断语句报错,是因为personal_properties[i]是结构体实例,不是指针,NULL是空指针常量,二者类型不匹配自然无法比较。
如果需要实现查找第一个未使用索引的逻辑,可参考以下两种方案:
前置先补全你缺失的初始化代码
首先你的allocate_obj代码有两个待修正点:
malloc行少了右括号- 缺少对
personal_properties所有成员的初始化逻辑
补全后的基础代码如下:
struct objectA* allocate_obj() { // 补全malloc的右括号 struct objectA *obj = (struct objectA*)malloc(sizeof(struct objectA)); // 建议加malloc失败判断 if(!obj) return NULL; // Assign global property obj->global_property.Pg = 32; // 初始化所有personal_properties的p1、p2为0,直接用memset更高效 memset(obj->personal_properties, 0, sizeof(obj->personal_properties)); return obj; }
方案1:新增标记位(最清晰,推荐)
修改property_setA结构体定义,新增使用状态标记位:
struct property_setA { u32 is_used; // 0代表未使用,1代表已使用 u32 p1; u32 p2; };
查找第一个未使用索引的逻辑:
u32 i, pd = -1; // pd初始化为-1代表无可用索引 for(i=0; i<MAX_PROP; i++){ if(obj->personal_properties[i].is_used == 0){ pd = i; // 找到后记得把标记位设为已使用 obj->personal_properties[i].is_used = 1; break; } } // 后续判断pd是否为-1,处理索引耗尽的场景
方案2:用现有字段做约定(无需改结构体)
如果不希望修改结构体定义,可以约定p1和p2同时为0时代表索引未使用(刚好你初始化的时候会把这两个字段设为0,符合初始全未使用的需求),判断逻辑改成:
u32 i, pd = -1; for(i=0; i<MAX_PROP; i++){ if(obj->personal_properties[i].p1 == 0 && obj->personal_properties[i].p2 == 0){ pd = i; break; } }
注意这个方案有局限性:如果业务逻辑允许
p1和p2同时设为0,就会出现误判。
内容的提问来源于stack exchange,提问作者vage
相关产品推荐
相关产品推荐

