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

数组值丢失问题:程序运行至p=="?"时v[l].a、v[l].b被置0求助

问题分析与解决方案

首先,从你描述的现象和给出的代码片段来看,最可能导致v[l].a和v[l].b被意外设为0的原因是数组越界访问引发的未定义行为,咱们一步步拆解问题:

1. checkIntersection函数中的循环越界隐患

你提供的checkIntersection函数里有这段循环逻辑:

for(k=0;k<=n;k++){
 if((v[k].a)==0) result=result;
 else if((c-v[k].b)%(v[k].a) == 0){
 result++;
 }
}

这里的循环条件是k <= n,但如果你的line *v数组是按照n个元素分配的(比如malloc(n * sizeof(line))),那数组的有效索引范围应该是0到n-1。当k = n时,你访问的v[n]属于数组以外的内存区域,这会触发未定义行为——它可能随机覆盖其他变量或数组元素的内存值,刚好就命中了v[l].a和v[l].b的存储位置,把它们改成了0。

这和你提到的“分配了超出需求的内存”并不冲突:哪怕内存多分配了,越界访问依然是非法操作,系统不会保障这部分内存的安全性,数据被篡改是这类问题的典型表现。

2. 未展示的p == "?"分支潜在问题

因为你只贴了dynam...的开头,假设这个分支里包含对v[l]的操作,那还要重点检查:

  • l的取值是否在v数组的有效索引范围内(不能小于0,也不能大于等于数组的实际长度)
  • 分支里的赋值逻辑是否有误,比如是不是不小心写出了v[l].a = 0; v[l].b = 0;这类不符合预期的代码

修复建议

  • 立刻修正checkIntersection的循环条件,确保只访问数组的有效元素:
    for(k=0; k < n; k++){
        // 原有逻辑保留
    }
    
  • 补全并检查p == "?"分支的代码,确认l的计算逻辑正确,赋值操作完全符合你的预期
  • 哪怕内存分配超量,也要严格遵守数组的索引范围,越界访问永远是C/C++程序中最容易引发诡异问题的根源之一

内容的提问来源于stack exchange,提问作者Bobo Lemnaru

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 07:12:32