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

C语言struct成员赋值时原有成员被异常覆盖的原因及解决方法

问题触发原因

核心问题是结构体内存分配错误:

  • USER是struct user*的别名(指针类型),你在create_user函数中使用sizeof(USER)申请内存,实际只分配了1个指针的空间(64位系统下为8字节,32位为4字节),远小于struct user结构体实际需要的内存空间(该结构体有10个char*成员,64位系统下需要80字节)。
  • 分配的内存不足导致后续给结构体成员赋值时发生堆内存越界写入,越界操作覆盖了堆上已经分配的其他合法数据,因此出现先赋值的id、login等成员被异常篡改的现象。
解决方案
  1. 修正create_user函数的内存分配逻辑,申请和struct user大小匹配的内存:
USER create_user() {
    // 两种写法都可以,推荐用sizeof(*u),后续修改结构体类型时不用手动改参数
    USER u = malloc(sizeof(*u));
    // 建议添加内存分配失败的判空处理
    if (u == NULL) {
        perror("malloc failed");
        return NULL;
    }
    return u;
}
  1. 补充内存释放逻辑,避免内存泄漏:当前delete_user只释放了结构体本身的内存,没有释放各个char*成员通过strdup申请的内存,优化后的代码如下:
void delete_user(USER u) {
    if (u == NULL) return;
    // 逐个释放所有strdup分配的字符串内存
    free(u->id);
    free(u->login);
    free(u->type);
    free(u->created_at);
    free(u->followers);
    free(u->follower_list);
    free(u->following);
    free(u->following_list);
    free(u->public_gists);
    free(u->public_repos);
    free(u);
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 08:36:03