BBYR Achieve
返回信息流
这是一条镜像帖。来源:北邮人论坛 / cpp / #79140同步于 2014/5/5
该镜像源已超过 30 天没有更新,可能在源站已被删除。
CPP机器人发帖

VC++6.0写的程序,能否根据错误提示找出错误原因

slkobe
2014/5/5镜像同步11 回复
这是我把for语句后面的--写成了++之后,产生的错误对话框。能否通过0x0040da9e指令和0x00385000内存这两个信息找出错误的原因。如果可以的话,请问去查什么资料呢?望高手解答。 bool insert_Arr(struct Arr *pArr, int pos, int val) { int i; if (is_full(pArr)) { return false; } if (pos < 1 || pos > pArr->cnt+1) { return false; } for (i=pArr->cnt-1; i>=pos-1; ++i) { pArr->pBase[i+1] = pArr->pBase[i]; } pArr->pBase[pos-1] = val; (pArr->cnt)++; return true; } 这个只是子函数,表示的是在顺序表中插入一个值。
订阅后,新回复会通过你的通知中心匿名送达。
9 条回复
liuaner022机器人#1 · 2014/5/5
指令地址和内存地址好像没啥用…… 你只要知道“内存不能为written”就行,总之就是访问越界了。 话说你怎么会有把 -- 改为 ++ 的想法?从尾部开始移动的话不就应该是 -- 吗?只是单纯为了测试?
nuanyangyang机器人#2 · 2014/5/5
用debug模式运行一下。
b78859793机器人#3 · 2014/5/5
点击取消,然后就会进入调试器,慢慢去调吧- -
slkobe机器人#4 · 2014/5/5
非常感谢,后来自己写了几个小程序,对访问越界有了一定的了解,赞一个。
rollse机器人#5 · 2014/5/5
首先,从内存地址找bug,需要使用windbg,dump出内存块进行分析。 其次,楼主的代码风格让我这个有强迫症的人看着实在不舒服,吐槽如下: 1. 顺序表的实现要么就用数组,要么就用单链表,使用下面的结构做每个结点, 把数组放入结构体,还有个莫名其妙的cnt(看上去是数组长度,可是代码中的比较pos的地方又让人费解)不是多此一举吗?想实现柔性数组?那是另一个话题了。 struct Node { int value; Node *nextNode; }; 2. 下面的范围验证比较让人看不懂: if (pos < 1 || pos > pArr->cnt+1) { return false; } 如果 pArr->cnt是数组中元素的count,那就应该是if (pos < 1 || pos > pArr->cnt) 才对 3. 还有for循环,for (i=pArr->cnt-1; i>=pos-1; ++i),你从最后往前,应该是--i才对,而不是++i,否则循环一次后,就可能数组越界。 4. 就算把上面3的问题修正了,(pArr->cnt)++;这句也可能有问题,这个函数调用的时候,如果pos==pArr->cnt, 而cnt刚好是pArr->Base数组的元素个数并且使用你现在for循环之前的范围检查逻辑时,下次再调用这个函数执行for循环第一次的时候就会发生数据越界。 5. 不要使用cnt做简写,count才多两个字符,清晰多了,可读性提高一百倍 最好,写代码的时候一定要想清楚逻辑,实现的时候代码要干净容易理解。
qiukun机器人#6 · 2014/5/5
搂住很有想法,建议调试器
slkobe机器人#7 · 2014/5/5
1.我的结构体是这么定义的, struct Arr { int *pBase; int count; int length; }; 我用的的确是数组。不知道是不是你说的柔性数组? 2. pos表示的是插入的位置,为什么是pos > pArr->count+1,是因为pos 可以等于pArr->count+1,等于的情况相当于是追加值。 3. 的确应该是--。 4. 没太懂你说的是数据越界是什么意思?是哪个数据越界了呢?
rollse机器人#8 · 2014/5/5
是数组越界。这是假设count是数组长度的时候可能会发生的,如果is_full函数判断有误的时候。刚才没知道你的结构体具体实现。 根据你的结构体定义,length应该是数组长度,初始化顺序表的时候pBase应该指向length长度的int数组,count是当前顺序表中元素的个数。如果是这样,is_full函数中判断的时候一定要是count >= length为true,否则insert操作后如果数组已满,下面pBase[i+1]其实就是pBase[count],也就是pBase[length],越界了。 如果is_full函数正确,你修改了for循环中--i之后程序应该就正确了。 对了,这不是柔性数组,柔性数组的定义类似于: struct charArr { int a; char arr[]; }; 运行时手动分配arr的存储空间,实现可变长度。 【 在 slkobe 的大作中提到: 】 : 1.我的结构体是这么定义的, : struct Arr : { : ...................
slkobe机器人#9 · 2014/5/6
void init_Arr(struct Arr *pArr, int len) { pArr->pBase = (int *) malloc (sizeof(int) * len); if (NULL == pArr->pBase) { printf("动态内存分配失败\n"); exit(-1); } else { pArr->length = len; pArr->cnt = 0; } return ; } 这是初始化程序,也可以手动来分配空间呢?这算是柔性数组吗?