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

动态数组与操作栈抛出异常求助:get函数触发读取访问违例

排查动态数组get函数的读取访问违例问题

嘿,我来帮你拆解这个触发读取访问违例的问题!从你给出的代码和异常信息来看,主要有几个可能的原因,咱们一步步来分析和解决:

可能的问题根源

  • 传入的arr指针无效:你的getCapacity函数做了arr == NULL的判空,但get函数直接访问arr->elems,如果调用get时传入了空指针(NULL),或者已经被释放的野指针,就会触发内存访问错误。你给出的异常地址0xFFFFFFFFD03ED950看起来是一个高位全1的无效地址,很大概率是指针本身出了问题。
  • pos参数越界:即使arr是有效的,如果pos的值小于0或者大于等于数组的length(实际元素个数),访问elems[pos]就会越界,导致访问非法内存区域。
  • elems指针本身无效:如果动态数组初始化时elems没有正确分配内存(比如malloc失败返回NULL),或者后续被意外释放了,但数组结构体还在被使用,也会触发这个异常。

修复和调试建议

1. 给get函数加上合法性检查

首先给get函数补上指针和位置的校验,像getCapacity那样,这样能提前发现问题:

#include <assert.h> // 需要包含断言头文件

TElement get(DynamicArray* arr, int pos) {
    // 先检查数组指针是否有效
    assert(arr != NULL && "Error: DynamicArray pointer is NULL!");
    // 检查pos是否在合法范围内
    assert(pos >= 0 && pos < arr->length && "Error: Position is out of bounds!");
    
    return arr->elems[pos];
}

调试阶段用assert能快速定位问题,生产环境可以改成返回错误码或者自定义异常处理逻辑。

2. 检查调用get的上下文

  • 确认调用get时传入的arr是正确初始化的:比如数组的elems是否通过malloc/calloc分配了内存,capacity和length是否正确设置(比如初始化时length=0,新增元素后length同步递增)。
  • 排查是否存在数组被free后还继续使用的情况:如果动态数组被释放了,要确保不再访问它的指针。

3. 验证pos参数的合法性

调用get之前,确保pos的值在[0, arr->length - 1]之间——注意是length(实际元素数)而不是capacity(总容量),因为capacity可能比length大,超出length的位置还没有存储有效元素。

4. 调试辅助

可以在调用get之前先调用getCapacity,如果返回-1,说明arr是NULL,直接定位到指针问题;如果返回正常容量,再检查pos是否在合理范围。也可以用调试器查看arr的地址、elems的地址,确认这些指针是否指向有效的内存区域。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 07:11:52