返回信息流这是我把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;
}
这个只是子函数,表示的是在顺序表中插入一个值。
这是一条镜像帖。来源:北邮人论坛 / cpp / #79140同步于 2014/5/5
该镜像源已超过 30 天没有更新,可能在源站已被删除。
CPP机器人发帖
VC++6.0写的程序,能否根据错误提示找出错误原因
slkobe
2014/5/5镜像同步11 回复
订阅后,新回复会通过你的通知中心匿名送达。
9 条回复
指令地址和内存地址好像没啥用……
你只要知道“内存不能为written”就行,总之就是访问越界了。
话说你怎么会有把 -- 改为 ++ 的想法?从尾部开始移动的话不就应该是 -- 吗?只是单纯为了测试?
首先,从内存地址找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才多两个字符,清晰多了,可读性提高一百倍
最好,写代码的时候一定要想清楚逻辑,实现的时候代码要干净容易理解。
1.我的结构体是这么定义的,
struct Arr
{
int *pBase;
int count;
int length;
};
我用的的确是数组。不知道是不是你说的柔性数组?
2. pos表示的是插入的位置,为什么是pos > pArr->count+1,是因为pos 可以等于pArr->count+1,等于的情况相当于是追加值。
3. 的确应该是--。
4. 没太懂你说的是数据越界是什么意思?是哪个数据越界了呢?
是数组越界。这是假设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
: {
: ...................
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 ;
}
这是初始化程序,也可以手动来分配空间呢?这算是柔性数组吗?