求数组交集的C代码将&&改为||后出现堆溢出错误的原因是什么?
堆溢出问题原因分析
你将循环条件的&&修改为||之后触发堆溢出,核心原因有两个:
- 循环逻辑完全错误
原本while(i < nums1Size && j < nums2Size)的逻辑是仅当两个数组都没有遍历完成时才执行循环,只要任意一个数组遍历结束,循环就会终止——因为此时剩下的元素不可能再和另一个数组产生交集。
改为||后,循环逻辑变成只要任意一个数组没遍历完就继续执行。当其中一个数组已经遍历完(比如j已经等于nums2Size),但另一个数组还没遍历结束时,循环仍会运行:- 此时访问
nums2[j]属于数组越界访问,会读到不可预知的内存值 - 如果读到的越界值碰巧和另一个数组的当前元素相等,就会触发写入逻辑,向
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
相关产品推荐
相关产品推荐

