运行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
相关产品推荐
相关产品推荐

