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);
}
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],应该是正确的,
好像还有其它错误
把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;
//...
}
类似的例子还可以举很多。
崩溃的时候进入调试,按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],应该是正确的,
好像还有其它错误
这应该是运行时出的错误.
把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};这样定义,如果没错了,那就证明我的推断是对的
n[5]时候错,因为pn[i]=n;这一句,你的n被当做字符串给CString赋值,但是n可能不是以0结尾的,所以访问越界。
你可以试试看,char n[6]={0};这样定义,如果没错了,那就证明我的推断是对的
作者: iblold 发布时间: 2011-12-01
相关阅读 更多
热门阅读
-
office 2019专业增强版最新2021版激活秘钥/序列号/激活码推荐 附激活工具
阅读:74
-
如何安装mysql8.0
阅读:31
-
Word快速设置标题样式步骤详解
阅读:28
-
20+道必知必会的Vue面试题(附答案解析)
阅读:37
-
HTML如何制作表单
阅读:22
-
百词斩可以改天数吗?当然可以,4个步骤轻松修改天数!
阅读:31
-
ET文件格式和XLS格式文件之间如何转化?
阅读:24
-
react和vue的区别及优缺点是什么
阅读:121
-
支付宝人脸识别如何关闭?
阅读:21
-
腾讯微云怎么修改照片或视频备份路径?
阅读:28