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

内存访问出错 求指点

foreveryou
2009/11/14镜像同步5 回复
vs2008下程序如下 #include <iostream> #include <cmath> #include <malloc.h> using namespace std; bool IsEqual(float f1, float f2, int absDelta) { int i1, i2; i1 = ( f1>0) ? ((int&)f1) : ( (int&) f1 - 0x80000000 ); i2 = (f2>0) ? ((int&)f2) : ( (int&) f2 - 0x80000000 ); return ((abs(i1-i2))<absDelta) ? true : false; } int main() { int r,s; int m1(1),m2(1); while(m1) { cout<<"请输入正确的信源符号个数"<<endl; cin>>r; if(r>0) m1=0; }; float* pr; pr=(float*)malloc(r*sizeof(float)); for(int k=1;k<=r;k++) { *pr=(float)1/r; pr+=sizeof(float); } //初始化信源分布矩阵 while(m2) { cout<<"请输入正确的信宿符号个数"<<endl; cin>>s; if(s>0) m2=0; }; float pji,sumrow(0),sunlist(0); float* p; p=(float*)malloc(r*sizeof(float)); for(int j=1;j<=r;j++) { for(int i=1;i<=s;i++) { int m(1); while(m) { cout<<"请输入p["<<j<<"]["<<i<<"]"<<endl; cin>>pji; *p=pji; if(*p>0.0 && *p<1.0) m=0; } sumrow+=*p; *p+=sizeof(float); } if(IsEqual(sumrow,1.0,0)) { cout<<"本行输入有误请重新输入"<<endl; j--; p-=r*sizeof(float); sumrow=0; } } //信道转移概率矩阵 cout<<p<<endl; p-=r*s*sizeof(float); cout<<p<<endl; free(pr); free(p); return 0; } 调试到红色那句时出现内存访问错误
订阅后,新回复会通过你的通知中心匿名送达。
5 条回复
ki机器人#1 · 2009/11/14
*p+=sizeof(float); 把 asterisk 去掉,你这样只减不加,当然会出错
ki机器人#2 · 2009/11/14
另外偏移量也不对
foreveryou机器人#3 · 2009/11/14
【 在 ki 的大作中提到: 】 : *p+=sizeof(float); : 把 asterisk 去掉,你这样只减不加,当然会出错 非常感谢! 但是我改了之后还是出现了访问错误 cout<<"请输入p["<<j<<"]["<<i<<"]"<<endl; 这句话就出现了问题 j 的访问出现错误 能解释下么?
ki机器人#4 · 2009/11/14
j 没错 , p 和 pr 的错太多了
ericyosho机器人#5 · 2009/11/14
1. 首先,不太明白IsEqual()的含义,LZ的意思是不是说,给定任意两个浮点数,如果它们在可容忍的范围之内,就认为它们相等?那为什么absDelta会是int型的呢? 难道他们只要整数部分部分相同,就认为是相同了? 2. LZ在IsEqual()函数里面,最后比较abs()和absDelta比较大小;但是在main函数里面调用,absDelta=0,那abs()出来的一个值,还能比0小么?那这个条件不是永远是错的么? 3. 其次没看明白,咋突然用malloc和free了……不是new和delete么? 4. 至于LZ提到的问题,为什么出来框框,不用想了。就是内存出错了。比如说,数组访问越界等。