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
相关产品推荐
相关产品推荐

