You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

两个哈希表间移动用户数据时同步删除异常求助

问题根源与解决方案

嗨,我来帮你搞定这个问题~

你的核心问题出在两个哈希表共享了同一个用户结构体的内存地址,导致修改其中一个会影响另一个:

问题分析

在delete_user函数里,你从active_users拿到tmp指针后,直接把它插入到inactive_users中。这意味着active_users和inactive_users的桶都指向同一块内存里的同一个user结构体。

然后你调用delete_item时,只是把这个结构体的occupied字段设为false——因为两个哈希表指向的是同一个结构体,所以inactive_users里的那个“用户”的occupied也会被改成false,看起来就像是被移除了,进而引发后续异常。

修复方案

迁移用户时,不要直接传递原指针,而是复制一份用户数据到新分配的结构体,再插入到inactive_users。修改后的delete_user函数如下:

void delete_user(hashtable *active_users, hashtable *inactive_users, char *input_a){
 if(contains(active_users, input_a) != -1){
    user *original_user = get_item(active_users, input_a); // 获取原用户指针
    
    // 为inactive用户分配新的内存
    user *inactive_user = malloc(sizeof(user));
    if(inactive_user == NULL){
        fprintf(stderr, "Error: Failed to allocate memory for inactive user\n");
        return;
    }
    
    // 复制原用户的所有数据
    strcpy(inactive_user->nick, original_user->nick);
    strcpy(inactive_user->name, original_user->name);
    inactive_user->occupied = true; // 新用户标记为已占用

    insert2(inactive_users, inactive_user); // 插入新用户到inactive表
    delete_item(active_users, input_a); // 标记原用户为未占用
    printf("+ user %s removed\n", input_a);
 }else{
    printf("+ user %s doesnt exist\n", input_a);
 }
}

额外注意事项

  • 内存管理:原用户结构体在active_users里只是被标记为未占用,并没有被释放。记得在程序退出前,遍历两个哈希表,释放所有通过malloc分配的user结构体,避免内存泄漏。
  • 如果你的哈希表后续会复用occupied=false的位置,也要确保不会重复释放内存。

内容的提问来源于stack exchange,提问作者user7437907

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 07:58:04