作者:壳牌盛行 | 来源:互联网 | 2023-07-07 14:23
typedef struct aa
{
CString a[10];
}bb;
bb cc[10];
cc[1].a[1]="tt"; //为什么这样赋值出错误啊
16 个解决方案
? 没错。你那里出什么错?贴出来。
我测试如下:
#include "afx.h"
int main()
{
typedef struct aa
{
CString a[10];
}bb;
bb cc[10];
cc[1].a[1]="tt"; //为什么这样赋值出错误啊
}
//VC6,setting中设置了使用MFC
_T这个宏只是UNICODE编码支持后,告诉编译器,所使用的UNICODE,所以和楼主这里说赋值没什么关系。
结构里面放什么都么关系,放类,放模板,结构就是一种数据类型的集合,自定义类型,没有什么好不好的。
写的这个程序 以前用过的没有问题
也没有改代码 就出问题了
这是完整代码
typedef struct tagHandleAlert
{
CString szShowData[1000];
}HANDLE_ALERT;
HANDLE_ALERT g_HandleArea[1000];
BOOL CMapPlusView::AnalyzeData(CString szInfo,WORD wVehicleID)
{
int iloc1 = 2;
int iloc2 = 0;
int iLength = szInfo.Replace(",",",");
iloc2=szInfo.Find(",", iloc1+1) != -1 ? szInfo.Find(",", iloc1) : szInfo.Find(";", iloc1);
for(int i = 0; i <= iLength; i++)
{
g_HandleArea[wVehicleID].szCarRuleData[i]=szInfo.Mid(iloc1, iloc2 - iloc1);// 错误是Debug Assertion failed! file:afx.inl line122
iloc1 = iloc2+1;
iloc2 = szInfo.Find(",", iloc1+1) != -1 ? szInfo.Find(",", iloc1) : szInfo.Find(";", iloc1);
}
return true;
}
跟一下你的代码,看iLength是否超过了1000
需要错误信息,这种用法肯定没有问题,看看你的头文件包含\
编译设置是否有问题.
对于ASSERT错误有标准查找错误的方法的
1. 找到assert报错的代码行(这里是afx.inl 122行)
2. 找到那段源代码,这里是
_AFX_INLINE CStringData* CString::GetData() const
{ ASSERT(m_pchData != NULL); return ((CStringData*)m_pchData)-1; }
3. 根据错误代码猜测原因
从错误代码看,这段代码出错是因为CString的一个私有数据被破坏了(m_pchData == NULL),而任何一个合法的CString对象,这个指针都不能为0
一般情况下,这种错误都是因为内存访问越界导致的,报错的地方往往不是导致错误的地方,因此光从这段代码不一定看得出原因
很不信,内存访问越界往往很难直接找到答案,需要走查代码、单步跟踪来找原因
抱万一希望看了你的代码,觉得毫无问题。关键是你的这个数组是个全局变量,很可能在其他模块它就被破坏了。
举个简单的例子,如果你曾经(只是瞎说的例子,不是真的你改变过这个)这样做
memset(&g_HandleArea[0], 0, sizeof(g_HandleArea));
这个错误必然出现
非常感谢大家 问题找到了 是对结构初始化时候 没有处理好
你是如何初始化的?莫非你又使用了memset?
个人建议对struct的结构成员而言,尽量使用简单的数据类型。象string、CString之类的复杂数据类型还是保守使用为好。如果使用,引入C++结构的初始化构造函数、析构函数进行初始化和现场的析构清理工作。
如果一旦使用了string、CString,就不要再使用memset进行初始化操作。