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

为什么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;属于浅拷贝,只会复制指针的地址,不会复制指针指向的字符串内容,进一步放大了野指针的影响。

修复方案

  1. 修正hossz的定义和使用:main里改成int hossz = 0;,所有涉及长度取值的地方,函数内用*hossz,主函数内直接用hossz,修改长度的时候操作*hossz += 1,不要修改指针本身
  2. 结构体字符串成员改用堆内存存储:赋值前用strdup复制字符串,示例:uj.nev = strdup(bekert_nev);、uj.osszetevok = strdup(bekert_ot);,程序退出前要记得free对应内存避免泄漏
  3. 主函数拿到recept_felvesz的返回值后,要更新原指针:receptek = uj;
  4. 调整realloc的错误处理逻辑:先把返回值赋值给临时指针,判断非空再赋值给原指针,避免realloc失败导致原内存泄漏

内容的提问来源于stack exchange,提问作者D. Albert

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 23:54:02