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

C语言结构体数组不保留值 3D字符串数组访问输出异常

问题原因
  • 悬空指针导致内容失效
    你存储在memPool中的所有字符串指针,都是strtok直接返回的指向临时栈缓冲区lineBuffer的地址。每次fgets执行时都会覆盖lineBuffer的内容,循环结束后这块栈内存的内容会被后续函数调用覆盖、或者变得不可预期,你之前存的指针自然就指向了无效内容,打印出来就会是乱码、错误值或者NULL。
  • 数组访问越界
    你的memPool定义为char * memPool[12][3],第二维的合法下标范围是0~2,但你打印时的循环条件是u <=3,会访问到下标3的非法内存,属于未定义行为,也会导致输出异常。
  • 变量未初始化
    lineCount定义时没有赋值初始值,第一次使用时值是随机的,可能导致后续变长数组定义、下标访问出现异常。
解决方法
  • 存储字符串时做深拷贝,不要直接存临时缓冲区的指针:将赋值语句nodeSet[Z].memPool[Y][X] = xDelim[b];替换为nodeSet[Z].memPool[Y][X] = strdup(xDelim[b]);,strdup会自动在堆上分配内存并拷贝字符串内容,生命周期不受栈缓冲区影响,后续不再使用时记得调用free释放对应内存避免泄漏。
  • 修正打印循环的越界问题:将内层循环的u <=3改为u < 3,如果Y轴实际只用到0~2的下标,也把o <=3改为o <3,避免访问非法内存。
  • 初始化所有局部变量:将int lineCount;改为int lineCount = 0;,消除未初始化变量带来的风险。
  • 清理冗余代码:删除无用的char * instruction[lineCount]定义,直接把strtok(instruction[x], "\n")改为strtok(lineBuffer, "\n")即可,不需要多一层中转。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 23:24:03