C语言struct成员赋值时原有成员被异常覆盖的原因及解决方法
问题触发原因
核心问题是结构体内存分配错误:
USER是struct user*的别名(指针类型),你在create_user函数中使用sizeof(USER)申请内存,实际只分配了1个指针的空间(64位系统下为8字节,32位为4字节),远小于struct user结构体实际需要的内存空间(该结构体有10个char*成员,64位系统下需要80字节)。- 分配的内存不足导致后续给结构体成员赋值时发生堆内存越界写入,越界操作覆盖了堆上已经分配的其他合法数据,因此出现先赋值的
id、login等成员被异常篡改的现象。
解决方案
- 修正
create_user函数的内存分配逻辑,申请和struct user大小匹配的内存:
USER create_user() { // 两种写法都可以,推荐用sizeof(*u),后续修改结构体类型时不用手动改参数 USER u = malloc(sizeof(*u)); // 建议添加内存分配失败的判空处理 if (u == NULL) { perror("malloc failed"); return NULL; } return u; }
- 补充内存释放逻辑,避免内存泄漏:当前
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
相关产品推荐
相关产品推荐

