问题描述
在项目开发的时候,想要在结构体中定义一个CString,用来存放从配置文件中读取的字符串数据。但是一旦执行到该参数读取时,编译器便会弹出报错。
//定义的结构体
typedef struct READ_INICONFIG
{
int nPage;
char szFileName[20];
CString strFileProperty;
}READINICONFIG;
代码举例:
//定义的结构体
READ_INICONFIG FileConfig;
//正常
FileConfig.nPage = GetPrivateProfileInt(_T("Main"), _T("Page"), 6, strPath);
GetPrivateProfileString("Main", "FileName", "TEXT", FileConfig.szFileName, 30, strPath);
//运行到此处会报错
GetPrivateProfileString(_T("Main"), _T("FileProperty"), szResult, FileConfig.strFileProperty, 255, strPath );
分析
经过调试可以发现,结构体里边所有的CString类型的变量开辟的空间都是NULL(错误的指针)。
实际上,这里是误把CString当做了与int、char相同的数据类型。其实CString是一个字符串类,这个类里是用指针用来存储内容,但是这个类里面除了指针以外,还是会有其他的成员。
另外,struct结构体申请内存都是根据结构体中最大字节数的数据类型申请的内存空间,是定长的。但是CString是不定长的。
而且一旦使用了CString,关于结构体操作的sizeof或者memset的使用都会出现异常。
综上所述:在我看来,在内存空间“定长”的结构体中,加入CString“不定长”的类,是会导致CString内部用来储存字符串的指针错误(无法开辟出合适的内存空间),在使用GetPrivateProfileString这类的函数时,就会出现错误。
结论
结构体中不建议使用CString,可以改为数组的方式,并给与固定的长度范围。
//定义的结构体
typedef struct READ_INICONFIG
{
int nPage;
char szFileName[20];
char szFileProperty[20];
}READINICONFIG;