+ -
当前位置:首页 → 问答吧 → vc6.0 ->vs 2008 编译错误

vc6.0 ->vs 2008 编译错误

时间:2011-12-01

来源:互联网

做的一个小程序段,RT

6.0下,完全没有问题,成功运行。
vs2008下,【Run-Time Check Failure #2 - Stack around the variable 'n' was corrupted.】
应该是说 越界的问题~~
 PS1. 我把char n[4]改成 char n[3],相同错误发生;
 PS2. 把char n[4]改成 char n[5],发生错误,
  显示【lim.exe 中的 0xfefefefe 处未处理的异常: 0xC0000005: 读取位置 0xfefefefe 时发生访问冲突】;

 PS3. 程序代码
void CLimDoc::Readpoint(CString FileName,CString pn[],float px[],float py[],int &ll)
{ //文件名 点号 x坐标 y坐标 点长度
FILE *fp;
int i;
float x=0,y=0;
char n[4];
if((fp=fopen(FileName,"r"))!=NULL)
{ i=0;
while(!feof(fp))
{ fgets(n,5,fp);
fscanf_s(fp,"%f%f\n",&x,&y);
pn[i]=n;
px[i]=x;
py[i]=y;
i++;
}
ll=i;
}

else
AfxMessageBox("读取文件失败!");
// AfxMessageBox(FileName); 
  fclose(fp);
}

作者: liujianxiou   发布时间: 2011-12-01

这应该是运行时出的错误.
把char n[4]改成 char n[5],应该是正确的,
好像还有其它错误

作者: Rotaxe   发布时间: 2011-12-01

单步调试和设断点调试是程序员必须掌握的技能之一。

崩溃的时候进入调试,按Alt+7键查看Call Stack里面从上到下列出的对应从里层到外层的函数调用历史。双击某一行可将光标定位到此次调用的源代码处。

不要使用
while (条件)
更不要使用
while (组合条件)
要使用
while (1) {
 if (条件1) break;
 //...
 if (条件2) continue;
 //...
 if (条件3) return;
 //...
}
因为前两种写法在语言表达意思的层面上有二义性,只有第三种才忠实反映了程序流的实际情况。
典型如:
下面两段的语义都是当文件未结束时读字符
whlie (!feof(f)) {
 a=fgetc(f);
 //...
 b=fgetc(f);//可能此时已经feof了!
 //...
}
而这样写就没有问题:
whlie (1) {
 a=fgetc(f);
 if (feof(f)) break;
 //...
 b=fgetc(f);
 if (feof(f)) break;
 //...
}
类似的例子还可以举很多。

作者: zhao4zhong1   发布时间: 2011-12-01

引用 1 楼 rotaxe 的回复:

这应该是运行时出的错误.
把char n[4]改成 char n[5],应该是正确的,
好像还有其它错误


但是在 vc6 下,没有丝毫问题呀,纠结啊~

作者: liujianxiou   发布时间: 2011-12-01

n[4]时错,因为你读了5个字节
n[5]时候错,因为pn[i]=n;这一句,你的n被当做字符串给CString赋值,但是n可能不是以0结尾的,所以访问越界。
你可以试试看,char n[6]={0};这样定义,如果没错了,那就证明我的推断是对的

作者: iblold   发布时间: 2011-12-01