为什么C语言函数返回的结构体数组与主函数中使用的结果不一致?
问题核心原因
你的代码存在多个致命错误共同导致了该现象,按优先级排序如下:
- 指针和普通变量完全用混
你在main函数中错误定义了int *hossz = 0;,hossz本身是指针变量,你所有位置直接把指针强转为int使用,拿到的是内存地址值,根本不是你需要的数组长度值。正确定义应该是int hossz = 0;,传参时传&hossz,函数内部取值用*hossz,而不是直接强转指针为int。 - 局部栈内存地址被长期引用
recept_felvesz函数里的bekert_nev、bekert_ot都是栈上的局部数组,函数执行结束后栈空间会被系统回收复用。你直接把这两个数组的地址赋值给结构体的nev、osszetevok指针,属于典型的野指针问题:函数未返回时栈空间还没被覆盖,所以打印内容正常;函数返回后主函数的其他操作会覆盖栈空间,再访问指针指向的内容就会出现乱码。
- realloc返回值没有更新原指针
recept_felvesz里调用realloc后返回的新内存地址,你在主函数里只赋值给了局部变量uj,没有更新原来的receptek指针,后续操作还在用已经被realloc释放的旧地址,属于非法内存访问。 - 浅拷贝结构体放大内存问题
你直接对结构体做赋值操作receptek[(int)hossz] = uj;属于浅拷贝,只会复制指针的地址,不会复制指针指向的字符串内容,进一步放大了野指针的影响。
修复方案
- 修正
hossz的定义和使用:main里改成int hossz = 0;,所有涉及长度取值的地方,函数内用*hossz,主函数内直接用hossz,修改长度的时候操作*hossz += 1,不要修改指针本身 - 结构体字符串成员改用堆内存存储:赋值前用
strdup复制字符串,示例:uj.nev = strdup(bekert_nev);、uj.osszetevok = strdup(bekert_ot);,程序退出前要记得free对应内存避免泄漏 - 主函数拿到
recept_felvesz的返回值后,要更新原指针:receptek = uj; - 调整
realloc的错误处理逻辑:先把返回值赋值给临时指针,判断非空再赋值给原指针,避免realloc失败导致原内存泄漏
内容的提问来源于stack exchange,提问作者D. Albert
相关产品推荐
相关产品推荐

