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

运行C语言DDA程序触发写入访问违例异常的排查求助

写入访问违例异常排查与解决

异常原因分析

报错提示“写入访问违例,k的值为0x1FFF112”,本质是数组越界写入非法内存区域,具体诱因包括:

  • 数组容量不足:k、k1数组定义的固定大小不足以容纳程序运行中m6累加后的下标值,导致写入了不属于数组的内存地址(0x1FFF112并非合法的数组内存范围)。
  • m6初始化错误:如果m6的初始值未设为0(或符合数组起始下标的值),会直接导致第一次赋值就越界。
  • 分支逻辑导致m6异常增长:代码中的goto跳转可能让某些累加m6的代码块被重复执行,或者分支逻辑设计缺陷导致m6计数远超预期。

代码问题定位

从给出的代码片段看,多处存在m6+=1后直接对k[m6]、k1[m6]赋值的操作,但没有任何边界检查。例如:

m6+=1;
k[m6]  = (-1)*j;
k1[m6] =      i;

当m6增长到超过k数组的最大下标时,就会触发写入访问违例。

解决方法

  • 确认数组容量:根据程序处理的顶点、边的最大数量,重新定义k、k1数组的大小,确保其能容纳所有可能的赋值操作。例如如果最大需要存储1000条数据,可定义为int k[1000], k1[1000];。如果无法预估大小,改用动态内存分配:
    // 初始分配内存
    int *k = malloc(100 * sizeof(int));
    int *k1 = malloc(100 * sizeof(int));
    int k_capacity = 100;
    // 每次m6增长前检查容量
    if (m6 >= k_capacity - 1) {
        k_capacity *= 2;
        k = realloc(k, k_capacity * sizeof(int));
        k1 = realloc(k1, k_capacity * sizeof(int));
    }
    m6 += 1;
    k[m6] = (-1)*j;
    k1[m6] = i;
    
  • 初始化m6:在使用m6前,确保其初始值为0(如果数组下标从0开始),避免初始下标就越界。
  • 添加边界检查:每次执行m6+=1后,立即检查m6是否超过数组的最大下标,若超过则触发报错或扩容,阻止非法写入:
    #define MAX_K_SIZE 500
    m6 +=1;
    if (m6 >= MAX_K_SIZE) {
        printf("数组k越界,m6值为%d\n", m6);
        exit(1); // 或处理扩容逻辑
    }
    k[m6] = (-1)*j;
    k1[m6] = i;
    
  • 梳理goto逻辑:检查所有goto跳转的分支,确保不会重复进入累加m6的代码块。比如确认goto a402等跳转后,是否会导致m6被多次无意义累加。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 09:35:19