CString 对象Format遇到的内存读取问题

henanwansui 2015-03-19 01:17:45
程序在vc6.0里是可以运行的,但放在VS2010环境下就不行了,例如
CString str;
float a;
str.Format("%.2f",a);
在vs2010下就会出现Access violation reading 错误,而且断点返回到atlsimpstr.h这个头文件中,
指向CStringData *GetData() const throw()
{
return (reinterpret cast<CStringData *>(m_pszData)-1);
},求教各位大神,这怎么改啊
...全文
285 10 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
Jerry_chy 2015-03-21
  • 打赏
  • 举报
回复
四楼说的是对的!或者你把vs编译环境换成debug也行
jiht594 2015-03-19
  • 打赏
  • 举报
回复
引用 8 楼 henanwansui 的回复:
7楼的方法都试了,str.Format(L"%.2f",a);这种会出现无法参数转化的错误,加T的话,没有用,还是指向atlsimpstr.h文件, 唉,这个问题折磨好几天了
你把代码垃圾文件删掉, 传到网盘. 如果不需要保密的话
henanwansui 2015-03-19
  • 打赏
  • 举报
回复
7楼的方法都试了,str.Format(L"%.2f",a);这种会出现无法参数转化的错误,加T的话,没有用,还是指向atlsimpstr.h文件, 唉,这个问题折磨好几天了
draculamx 2015-03-19
  • 打赏
  • 举报
回复
vc6.0里面,CString 默认情况下代表的是ascii字符集,而VC2010里,默认情况下,CString代表的是unicode字符集,所以,赵4老师说的是对的 str.Format(_T("%.2f"),a); 要加一个_T(),或者 str.Format(L"%.2f",a); 因为在VC2010下CString的Format函数的原型是: Format(const wchar_t* ,...) 所以你的第一个参数,必须使用wchar的字符串常量
henanwansui 2015-03-19
  • 打赏
  • 举报
回复
不是a是否初始化的问题,问题出在Format函数处,断点停在这,然后转到 CStringData *GetData() const throw() { return (reinterpret cast<CStringData *>(m_pszData)-1); }这个位置,会显示Unhandled exception at 0x5a20fe3c(mfc100d.dll ) in 76p.exe :0xC0000005:Access violation reading location 0x00006644, 而且程序中的CString 类的对象在vc6.0中是可以编译的,但在VS2010环境下就出现问题,
a1317338022 2015-03-19
  • 打赏
  • 举报
回复
a需要初始化
赵4老师 2015-03-19
  • 打赏
  • 举报
回复
str.Format("%.2f",a); 和 str.Format(_T("%.2f"),a); 不是一回事!
jiht594 2015-03-19
  • 打赏
  • 举报
回复
引用 2 楼 henanwansui 的回复:
其实,我已经试过这种可能了,还是错误。我看了程序,出现错误的都是CString类,而且最后的断点都指向 CStringData *GetData() const throw() { return (reinterpret cast<CStringData *>(m_pszData)-1); }这个位置
我就vs2010, 为什么我能跑过呢

#include <StdAfx.h>
#include<iostream>
#include <afxwin.h>
using namespace std;

int main(int argc, char* argv[])
{
	CString str;
	float a = 0;
	str.Format(_T("%.2f"),a);
	cout << a << endl;
	system("pause");
}

henanwansui 2015-03-19
  • 打赏
  • 举报
回复
其实,我已经试过这种可能了,还是错误。我看了程序,出现错误的都是CString类,而且最后的断点都指向 CStringData *GetData() const throw() { return (reinterpret cast<CStringData *>(m_pszData)-1); }这个位置
jiht594 2015-03-19
  • 打赏
  • 举报
回复
float a = 0; 永远记住要初始化变量. 所有有时候不是必须的, 但是省的麻烦.

70,019

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧