CString 异常

liutingting2020 2014-07-12 02:50:36
我在MFC中定义了一个嵌套的数据结构
typedef struct FileInfo{
CString fileName;
CString fileAttributes;
......
};

typedef struct PFileInfo{
int ulcount;
FileInfo FileInfo[1];

}
我有两个问题要问:
1.这种嵌套的数据机构,我完全不懂哎。有人知道为啥别人告诉我这种类型的数据结构赋值要用memcpy或者strcpy?
2.
我在菜单的处理函数中,处理一个该类型的变量NormalFileInfo。我不知道这个变量该在哪里初始化。

在该处理函数中,我
NormalFileInfo->FileInfo[0]=m_ListCtrl;
NormalFileInfo->ulCount++;

没有用memcpy对它进行赋值呀???CString 异常 崩溃 弹错
有一个CString A,是与界面上的一个combo box 控件绑定的(暂时命名它为CA)


我的程序运行时,出现异常了,异常如下:


中断位置,在CString的文件里是

CStringData* GetData() const throw()
{
return( reinterpret_cast< CStringData* >( m_pszData )-1 );
}
在return那里中断了。

是不是因为NormalFileInfo溢出了呢?
求大神解答。。

...全文
156 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
allenltiverson 2014-07-26
  • 打赏
  • 举报
回复
引用 9 楼 liutingting2020 的回复:
[quote=引用 8 楼 crestine 的回复:] [quote=引用 7 楼 allenltiverson 的回复:] [quote=引用 5 楼 crestine 的回复:] 原来1楼已有回复啊,我看到帖子就直接拉到末尾开始写回复了
还真是,我们大部分的意思都是一样的啊!哈哈,猿粪啊!!![/quote] [/quote] 各位亲爱的们,后来我把我那个结构中的CString类型换成WCHAR类型和ULONG类型,这样以后,可以用wcscpy,strcpy对他们进行初始化吗?[/quote] strcpy这类函数是针对字符串使用的,可以用memcpy,通用!
liutingting2020 2014-07-14
  • 打赏
  • 举报
回复
引用 8 楼 crestine 的回复:
[quote=引用 7 楼 allenltiverson 的回复:] [quote=引用 5 楼 crestine 的回复:] 原来1楼已有回复啊,我看到帖子就直接拉到末尾开始写回复了
还真是,我们大部分的意思都是一样的啊!哈哈,猿粪啊!!![/quote] [/quote] 各位亲爱的们,后来我把我那个结构中的CString类型换成WCHAR类型和ULONG类型,这样以后,可以用wcscpy,strcpy对他们进行初始化吗?
caewow 2014-07-13
  • 打赏
  • 举报
回复
引用 7 楼 allenltiverson 的回复:
[quote=引用 5 楼 crestine 的回复:] 原来1楼已有回复啊,我看到帖子就直接拉到末尾开始写回复了
还真是,我们大部分的意思都是一样的啊!哈哈,猿粪啊!!![/quote]
allenltiverson 2014-07-12
  • 打赏
  • 举报
回复
引用 5 楼 crestine 的回复:
原来1楼已有回复啊,我看到帖子就直接拉到末尾开始写回复了
还真是,我们大部分的意思都是一样的啊!哈哈,猿粪啊!!!
Sandrer 2014-07-12
  • 打赏
  • 举报
回复
typedef struct PFileInfo{ int ulcount; FileInfo FileInfo[1]; } 楼主的这个定义, 其实 FileInfo 是一个指针 只不过定义它的人不喜欢用 FileInfo *xxxx 而已 访问这个结构体的时候, 可以先判断 ulcount 的数量, 再对 FileInfo 进行索引访问了 其它的就像楼上说的了
caewow 2014-07-12
  • 打赏
  • 举报
回复
原来1楼已有回复啊,我看到帖子就直接拉到末尾开始写回复了
caewow 2014-07-12
  • 打赏
  • 举报
回复
感觉楼主还在这方面还存在着很大的问题啊。 1.对于楼主所给的 FileInfo 这样类型的变量,初始化的时候一定不要使用 strcpy 、memcpy 等函数,因为它们只适合于操作基础数据类型,如果应用它们去操作复杂的数据类型,常常会出错。初始化这样的变量的时候,尽量重载 = ,这样不容易出错。 比如,你可以这样来初始化一个 FileInfo 对象:

CString strFileName(_T("abc.txt"));
CString strFileAttrib(_T("FILE_ATTRIBUTE_ARCHIVE"));
FileInfo fi;
fi.fileName=strFileName;//绝对不要用 strcpy 。这里可以用=赋值,因为 CString 类重载了=操作符,所以我们可以直接用
fi.fileAttributes=strFileAttrib;
2.对于 PFileInfo 的定义,我就不懂了,既然只有1个,为什么非要用数组呢? 这样写不好吗?
typedef struct PFileInfo
{
   int ulcount;
   FileInfo   FileInfo;
};
3.对于 NormalFileInfo->FileInfo[0]=m_ListCtrl 这行代码,我表示怀疑,这也能行?类型不匹配吧? 也许是这样的?

PFileInfo *NormalFileInfo;
FileInfo fi;
fi.fileName=m_ListCtrl.GetItemText(...);//获取列表框控件某行某列处的值
fi.fileAttributes=m_ListCtrl.GetItemText(...);
NormalFileInfo->FileInfo=fi;
或者:

PFileInfo *NormalFileInfo;
NormalFileInfo->FileInfo.fileName=m_ListCtrl.GetItemText(...);//获取列表框控件某行某列处的值
NormalFileInfo->FileInfo.fileAttributes=m_ListCtrl.GetItemText(...);
4.至于 GetData 函数的问题,明显是强制转换失败了,应该下个断点调试一下。
dvlinker 2014-07-12
  • 打赏
  • 举报
回复
赞一个!赞一个!
dvlinker 2014-07-12
  • 打赏
  • 举报
回复
引用 1 楼 allenltiverson 的回复:
代码不是很完整,就针对我先看到的提几点参考意见吧。 1.FileInfo FileInfo[1]; 这种类型和变量名称一样的命名方式是非常不可取的,先不说是否编译的过,假如你有几个这种类型的变量,如何区分?这样对编译器也是一种挑战。 2.类似memcpy这种函数,参数尽量是原始数据类型,比如int,char等基本类型和只包含基本数据类型的结构体或者类。像CString这种涉及到模板或者包含stl里面的容器的等相对复杂的类型,由于内部实现复杂,而且内存布局不固定,用memcpy会出问题,因为memcpy默认是按照bit位进行拷贝的。所以,对于非原始数据类型,尽量去重载=操作符,或者对成员一个一个的赋值。 3. typedef struct PFileInfo{ int ulcount; FileInfo FileInfo[1];//为什么定义一个结构的变量非要弄成数组呢? } 3.NormalFileInfo->FileInfo[0]=m_ListCtrl; 你确定这是同一种类型?你的编译器能编过?
是这样子的
allenltiverson 2014-07-12
  • 打赏
  • 举报
回复
代码不是很完整,就针对我先看到的提几点参考意见吧。 1.FileInfo FileInfo[1]; 这种类型和变量名称一样的命名方式是非常不可取的,先不说是否编译的过,假如你有几个这种类型的变量,如何区分?这样对编译器也是一种挑战。 2.类似memcpy这种函数,参数尽量是原始数据类型,比如int,char等基本类型和只包含基本数据类型的结构体或者类。像CString这种涉及到模板或者包含stl里面的容器的等相对复杂的类型,由于内部实现复杂,而且内存布局不固定,用memcpy会出问题,因为memcpy默认是按照bit位进行拷贝的。所以,对于非原始数据类型,尽量去重载=操作符,或者对成员一个一个的赋值。 3. typedef struct PFileInfo{ int ulcount; FileInfo FileInfo[1];//为什么定义一个结构的变量非要弄成数组呢? } 3.NormalFileInfo->FileInfo[0]=m_ListCtrl; 你确定这是同一种类型?你的编译器能编过?

15,979

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 界面
社区管理员
  • 界面
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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