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

求数组交集的C代码将&&改为||后出现堆溢出错误的原因是什么?

堆溢出问题原因分析

你将循环条件的&&修改为||之后触发堆溢出,核心原因有两个:

  • 循环逻辑完全错误
    原本while(i < nums1Size && j < nums2Size)的逻辑是仅当两个数组都没有遍历完成时才执行循环,只要任意一个数组遍历结束,循环就会终止——因为此时剩下的元素不可能再和另一个数组产生交集。
    改为||后,循环逻辑变成只要任意一个数组没遍历完就继续执行。当其中一个数组已经遍历完(比如j已经等于nums2Size),但另一个数组还没遍历结束时,循环仍会运行:
    1. 此时访问nums2[j]属于数组越界访问,会读到不可预知的内存值
    2. 如果读到的越界值碰巧和另一个数组的当前元素相等,就会触发写入逻辑,向res数组中追加元素
  • 结果数组内存分配不足
    你的res仅固定分配了10个int的内存空间,循环不会正常终止的情况下,写入的元素数量很快就会超过10,写穿堆块的边界,最终触发堆溢出错误。

另外你现有的代码本身还存在两个明显错误,即使不改&&也会得到不符合预期的结果:

  • 结果数组分配不合理:固定分配10个int的空间,只要两个数组的交集元素超过10个,就算用&&也会触发堆溢出。正确的做法是分配两个数组长度的较小值作为res的空间,因为交集的元素数量不可能超过短数组的长度。
  • returnSize赋值错误:*returnSize = sizeof(res)/sizeof(res[0])这行逻辑完全错误,res是指针类型,sizeof(res)拿到的是指针本身的大小(64位系统为8字节、32位系统为4字节),计算得到的是固定值,和实际返回的交集元素个数无关。正确的赋值应该是*returnSize = k,k就是你实际写入res的元素个数。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 11:48:03